Python GAE/P:为RPC调用实现指数退避

Python GAE/P:为RPC调用实现指数退避,python,google-app-engine,rpc,Python,Google App Engine,Rpc,我知道当RPC调用失败时,指数退避是一件好事。到目前为止,在我的GAE/P应用程序中,我使用任务队列实现了指数退避: deferred.defer(function_that_makes_RPC_call) 如果执行RPC调用的函数引发异常,那么任务队列的指数退避将处理该异常,我不必担心它 然而,一个问题是deferred.defer本身就是一个可能失败的RPC调用!我有时会遇到这样的错误: DeadlineExceededError:API调用taskqueue.BulkAdd()花费的时间

我知道当RPC调用失败时,指数退避是一件好事。到目前为止,在我的GAE/P应用程序中,我使用任务队列实现了指数退避:

deferred.defer(function_that_makes_RPC_call)
如果执行RPC调用的函数引发异常,那么任务队列的指数退避将处理该异常,我不必担心它

然而,一个问题是deferred.defer本身就是一个可能失败的RPC调用!我有时会遇到这样的错误:

DeadlineExceededError:API调用taskqueue.BulkAdd()花费的时间太长 回复,但被取消

因此,我似乎不能再懒惰了,必须实施自己的指数退避(

我正在考虑在deferred.deferred周围放置一个包装器,它使用如下方式实现指数退避:

@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)
这里,decorator实现了退避,其中在引发一个枚举异常(例如,exception1,exception2,…)时会发生重试

关于这一点,有几个问题:

  • 这是实现指数退避的好解决方案吗
  • 我需要列出哪些例外情况?除了DeadLineExceederRor之外的任何情况

  • 我知道有我自己的指数退避然后提交到任务队列有点多余,但我认为延迟。延迟应该比其他RPC调用更很少失败,我希望尽快响应请求。

    特别是对于尝试将延迟的任务排队时出现的
    deadlineexceedderror
    只需进行back2back重试,而不是使用指数回退-由于截止时间间隔本身的原因,尝试之间的间隔将为5秒,在请求本身到达其截止时间之前,最多可进行12次重试


    不过,对于其他类型的失败可能是一个好主意。

    我认为此DeadlineExceederRor特定于API调用,与60秒的请求DeadlineExceederRor相比,它是5秒。看到了吗,那个DeadlineExceederRor?是的,你是对的。