我们正在使用GAE deferred library卸载某些耗时的任务,并想知道如何为这些卸载的任务设置重试限制。我们遇到的问题是,由于某些不可恢复的异常,任务永远不会成功,因此会一直重试某些任务。
答案 0 :(得分:1)
queue:
- name: fooqueue
rate: 1/s
retry_parameters:
task_retry_limit: 7
task_age_limit: 2d
- name: barqueue
rate: 1/s
retry_parameters:
min_backoff_seconds: 10
max_backoff_seconds: 200
max_doublings: 0
- name: bazqueue
rate: 1/s
retry_parameters:
min_backoff_seconds: 10
max_backoff_seconds: 200
max_doublings: 3
答案 1 :(得分:1)
根据the documentation,_retry_options
API的deferred.defer
可用于将重试选项传递到关联的Task()
实例:
_countdown,_eta,_headers,_name,_target,_transactional,_url, _retry_options ,_queue:传递到任务队列 - 有关详细信息,请参阅任务队列文档。
...
您可以使用TaskRetryOptions()'s
task_retry_limit
属性:
task_retry_limit
失败任务的最大重试次数。
在推送队列中,每次App Engine尝试任务时计数器都会递增,直到达到指定的task_retry_limit。如果使用task_age_limit指定,App Engine将重试该任务,直到达到两个限制。
在拉取队列中,每次租用任务时计数器都会递增,直到达到指定的task_retry_limit。一旦租用了限制中指定的次数,任务就会自动删除。
注意:答案仅基于文档,我实际上没有实现它,YMMV。
答案 2 :(得分:0)
检查任务中的 X-Appengine-Taskretrycount 和 X-Appengine-Taskexecutioncount http标头值。
如果您不想重试任务,可以提出 deferred.PermanentTaskFailure 例外。此异常将仅被记录,任务不会再次运行。
访问http标头的不同方式:
对于由taskqueue触发的http处理程序: num_tries = self.request.headers.get(' X-AppEngine-TaskRetryCount')
对于由延迟库触发的函数: num_tries = webapp2.get_request()。headers.get(' X-AppEngine-TaskRetryCount')