【问题标题】:Google Task Queue REST pull returning 500 occasionallyGoogle Task Queue REST pull 偶尔返回 500
【发布时间】:2016-09-29 08:26:00
【问题描述】:

我有一个 Python 进程在无限循环中每秒从Google TaskQueue REST API 租用任务:

credentials = GoogleCredentials.get_application_default()
task_api = googleapiclient.discovery.build('taskqueue', 'v1beta2', credentials=credentials)
while True:
    tasks = task_api.tasks().lease(...).execute()
    time.sleep(1)

这个过程有时会运行好几个小时。但偶尔会因 HTTP 错误之一而崩溃:

  • 500 后端错误
  • 503 后端错误
  • 500 后端发生内部错误

该进程正在 Google 计算引擎服务器上运行。它使用由 GOOGLE_APPLICATION_CREDENTIALS 环境变量指定的服务帐户密钥。这是谷歌任务队列错误还是我错过了什么?例如。我需要在每次租赁请求之前重新阅读凭据吗?

【问题讨论】:

  • 后端错误是洪水保护 google 建议您实施指数退避。
  • @DalmTo 你能发布一些文档的链接吗?
  • 你们两个拥有谷歌搜索的力量。 Google 错误是系统范围的,它对所有 API 都有好处developers.google.com/drive/v3/web/…
  • 嗯,是关于Google Drive的,不知道也适用于Google App Engine。
  • 正如我所说的“Google 错误是系统范围的,它对所有 API 都有好处”400 和 500 错误在 Google 系统中是标准的,除了可能是特定于 API 的奇怪的 400 错误。所以是的,它适用于应用引擎 500 错误。 500 错误是服务器告诉您您将要快速或服务器打嗝等待一秒钟然后重试的方式。它很少需要超过 6 次重试才能启动和响应。

标签: python google-app-engine google-compute-engine task-queue


【解决方案1】:

由于@DalmTo刚刚在cmets中回答了,我总结一下他的回答,加上Python的解决方案。

Google 5xx 支持的错误是洪水保护,Google 建议实施exponential backoff。尽管链接指向 Google Drive API,但对于所有 API(包括 GAE),Google 错误都是系统范围的。它很少需要超过 6 次重试才能启动和响应。

在挖掘了googleapiclient源之后,我发现这个库中已经实现了指数退避,所以解决方案很简单:

tasks = task_api.tasks().lease(...).execute(num_retries=6)

http.py::_should_retry_response() 的来源显示,除了 HTTP 5xx 错误之外,当 JSON 响应包含 userRateLimitExceededrateLimitExceeded 错误时,请求也会重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 2021-11-02
    • 2015-08-27
    • 2014-01-04
    • 2011-06-11
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多