2017-02-26 20 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()