我知道当RPC调用失败时,指数退避是一件好事。所以在我的GAE/P程序到目前为止,我还通过使用任务队列实现指数退避:GAE/P:为RPC调用实现指数退避
deferred.defer(function_that_makes_RPC_call)
如果还是RPC调用的函数抛出一个异常,那么任务队列的指数退避需要照顾它,我不必担心它。
然而,一个问题是,deferred.defer本身就是一个可能会失败的RPC调用!我有时会得到这个错误:
DeadlineExceededError: The API call taskqueue.BulkAdd() took too long to respond and was cancelled.
所以看来我不能再懒惰,必须实现我自己的指数退避。 :(
我想放在一个包装围绕deferred.defer
实现使用backoff指数后退,就像这样:
@backoff.on_exception(backoff.expo,
(exception1, exception2, ...),
max_tries=8)
def defer_wrapper(function_that_makes_RPC_call):
deferred.defer(function_that_makes_RPC_call)
这里,装饰实现,其中一个重试发生在枚举例外,当一个退避(例如,exception1,exception2,...)提高
一对夫妇的问题,这个问题:。
- 这是一个很好的soluti为实现指数退避?
- 我需要列出哪些例外?除了DeadlineExceededError以外的任何内容?
我知道这是有些多余有我自己的指数退避,然后提交到任务队列,但我认为应该deferred.defer
比其他RPC调用失败,更罕见的,我想给回应尽快请求。
我认为这个DeadlineExceededError特定于API调用,并且是5秒,而不是请求60分钟的DeadlineExceededError。请参阅https://cloud.google.com/appengine/articles/deadlineexceedederrors –
啊,* that * DeadlineExceededError?你是对的。 –