2016-08-23 68 views
1

我知道当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,...)提高

一对夫妇的问题,这个问题:。

  1. 这是一个很好的soluti为实现指数退避?
  2. 我需要列出哪些例外?除了DeadlineExceededError以外的任何内容?

我知道这是有些多余有我自己的指数退避,然后提交到任务队列,但我认为应该deferred.defer比其他RPC调用失败,更罕见的,我想给回应尽快请求。

回答

1

特别是DeadlineExceededError试图排队延迟任务时,我只是做backback back重试而不是使用指数回退 - 由于截止时间间隔到期本身,这些尝试将间隔5秒,这会给出一个最大值在请求本身达到其最后期限之前,共有12次重试。

虽然对于其他类型的故障可能是一个好主意。

+0

我认为这个DeadlineExceededError特定于API调用,并且是5秒,而不是请求60分钟的DeadlineExceededError。请参阅https://cloud.google.com/appengine/articles/deadlineexceedederrors –

+0

啊,* that * DeadlineExceededError?你是对的。 –