Python GAE/P:为RPC调用实现指数退避
我知道当RPC调用失败时,指数退避是一件好事。到目前为止,在我的GAE/P应用程序中,我使用任务队列实现了指数退避: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()花费的时间
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,…)时会发生重试
关于这一点,有几个问题:
我知道有我自己的指数退避然后提交到任务队列有点多余,但我认为延迟。延迟应该比其他RPC调用更很少失败,我希望尽快响应请求。特别是对于尝试将延迟的任务排队时出现的
deadlineexceedderror
只需进行back2back重试,而不是使用指数回退-由于截止时间间隔本身的原因,尝试之间的间隔将为5秒,在请求本身到达其截止时间之前,最多可进行12次重试
不过,对于其他类型的失败可能是一个好主意。我认为此DeadlineExceederRor特定于API调用,与60秒的请求DeadlineExceederRor相比,它是5秒。看到了吗,那个DeadlineExceederRor?是的,你是对的。