为使用GAE延迟库排队的任务指定重试限制

时间:2016-04-13 16:40:04

标签: python google-app-engine task-queue

我们正在使用GAE deferred library卸载某些耗时的任务,并想知道如何为这些卸载的任务设置重试限制。我们遇到的问题是,由于某些不可恢复的异常,任务永远不会成功,因此会一直重试某些任务。

3 个答案:

答案 0 :(得分:1)

根据documentation

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:传递到任务队列 - 有关详细信息,请参阅任务队列文档。

来自the Task() doc

enter image description here

...

enter image description here

您可以使用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')