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

Google Task Queue REST pull returning 500 occasionally

我有一个 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 错误之一而崩溃:

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

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

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

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

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

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