python - GAE/P : Implementing Exponential backoff for RPC calls

标签 python google-app-engine rpc

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

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)

这里,装饰器实现了退避,当引发枚举异常之一(例如,异常 1、异常 2...)时,会发生重试。

与此相关的几个问题:

  1. 这是实现指数退避的良好解决方案吗?
  2. 我需要列出哪些异常(exception)情况?除了 DeadlineExceededError 之外还有什么吗?

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

最佳答案

特别是对于尝试将延迟任务排队的 DeadlineExceededError ,我只会进行 back2back 重试,而不是使用指数退避 - 由于截止时间间隔到期本身,尝试将间隔 5 秒无论如何,在请求本身达到截止日期之前最多可以重试 12 次。

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

关于python - GAE/P : Implementing Exponential backoff for RPC calls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39100535/

相关文章:

python - 在 python 中的 pandas 数据框上从 groupby 中选择索引值

python - PostgreSQL和Python中的概率记录联动(匹配)

python - Numpy 会自动检测和使用 GPU 吗?

google-app-engine - Appengine with Go : Is there a http. Handle prehook 或类似的东西?

android - 在 Android 中从 AppEngine 服务器获取图像的最佳方式(Blob 与 URL)

Python:通过引用传递修改参数

java - Google App Engine Tic Tac Toe Java 示例 OAUTH 失败

电子商务网站的 REST

java - 如何从服务器获取序列化策略文件的强哈希名称?

java - 从 'remote' 异常中的通用异常链工具中排除