python - Google 任务队列 REST 拉取偶尔返回 500

标签 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 计算引擎服务器上运行。它使用由 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/

相关文章:

Python排序列表和关联列表

java - python vs java 用于存储字典的内存

java - Google App Engine - Cloud Console Stackdriver 跟踪详细信息

google-app-engine - 如何在应用引擎 flex (Python 3.7) 中本地模拟 Google 云任务服务?

java - Cassandra - 许多小节点或更少的大节点?

Python - 打开网站并发送 cookie

Python - 从一行中的 URL 解析特定值

python - 如何修改ndb.Query对象?

awk - 如何获取GCE实例的内部IP地址列表

google-cloud-platform - 为什么 GCSfuse 无法看到 GS 存储桶,而 GSutil 可以?