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