2017-02-26 51 views
0

我有几个lambda函数正在制作多个AWS Elastic beanstalk API使用python编写的调用。它工作正常。但自从最近几天以来,我们收到了节流错误。在与AWS讨论之后,他们已经告诉在代码中添加指数退避逻辑。所以,如果它是节流阀,将在增量间隔重试相同的API调用。我知道他们在说什么以及它是如何工作的,但我不明白如何添加我的代码。他们有CLI的文档,但他们没有API的如下,http://docs.aws.amazon.com/general/latest/gr/api-retries.html需要建议在python中的AWS API中添加指数回退逻辑

有人可以请给我一个简单的例子我们如何映射API调用的响应和重试,如果它的节流像我的一个API调用我正在使用我的代码如下,

import boto3 

conn = boto3.client('elasticbeanstalk') 

response = conn.describe_environments(EnvironmentNames=["xyz"]) 

return response 

我知道简单的方法,用if条件,通过检查的反应是“率超过了”做它用,而不要我想我能做到这一点。但我想检查CLI的例子中提供的,我怎样才能做类似的API?

任何帮助,将不胜感激!

回答

0

可以使用proxy object环绕任何AWS客户对象,并添加一些retrying logic的代理对象:

import retrying 
import wrapt 

class RetriedClient(wrapt.ObjectProxy): 
"""Add retry logic to a boto3 client. 

Wait 2^x * 1000 milliseconds between each retry, up to 10 seconds, 
then 10 seconds afterwards. 

""" 

    @retry(wait_exponential_multiplier=1000, wait_exponential_max=10000) 
    def __getattr__(self, name): 
     return getattr(self.__wrapped__, name) 


# Create a boto3 client to Cloudformation 
cf_client = boto3.client('cloudformation') 

# Add exponential backoff retries to all client methods 
wrapped_cf_client = RetryClient(cf_client) 

然后,你可以使用wrapped_cf_client,你通常会使用boto3内置的客户端:

resp = wrapped_cf_client.describe_stacks()