谷歌任务队列REST偶尔返回500

时间:2016-09-29 08:26:00

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

我让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 Computing Engine服务器上运行。它使用由GOOGLE_APPLICATION_CREDENTIALS env变量指定的服务帐户密钥。这是Google Task Queue错误还是我错过了什么?例如。在每次租赁请求之前是否需要重新读取凭证?

1 个答案:

答案 0 :(得分:2)

由于@DalmTo刚刚在评论中回答,我总结了他的答案并添加了Python解决方案。

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

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

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

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