我有一个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 环境变量指定的服务帐户 key 。这是 Google 任务队列错误还是我错过了什么?例如。我是否需要在每次租赁请求之前重新读取凭据?
最佳答案
由于@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 响应包含 userRateLimitExceeded
或 时,也会重复请求>rateLimitExceeded
错误。
关于python - Google 任务队列 REST 拉取偶尔返回 500,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39765136/