在Google应用引擎任务队列中重试最多次数后处理失败

时间:2017-10-27 16:22:39

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

我正在使用google-api-python-client,我正在使用谷歌应用引擎任务队列进行一些异步操作。

对于特定任务队列,我还设置了应该重试任务的最大次数(在我的情况下,重试不太可能成功,所以我想限制它们。)

有没有办法编写一个处理程序,可以处理即使在指定的重试次数之后任务仍然失败的情况?

基本上,如果我的重试限制为5,则在5次重试失败之后,我想将任务移动到另一个队列,在该队列中可以重试更多次,重试之间的间隔更大,这样就更有可能成功。

来自here我相信我可以在每次重试中使用 X-AppEngine-TaskExecutionCount 标头并编写一些自定义逻辑以了解任务最后何时执行以及实现这一目标,但我想知道是否有更清洁的方式。

顺便说一句 X-AppEngine-TaskExecutionCount 指定(来自文档) 此任务在执行阶段之前失败的次数。此数字不包括由于缺少可用实例而导致的失败。

1 个答案:

答案 0 :(得分:1)

至少目前不支持自动将任务从一个队列移动到另一个队列。

一种选择是将任务保持在同一队列中,增加最大重试次数并使用retry_parameters来自定义重试退避策略(即重试之间的时间增加):

  

<强> retry_parameters

     

可选。配置失败任务的重试尝试。这个补充   允许您指定重试失败的最大次数   特定队列中的任务。您还可以设置重试的时间限制   尝试并控制尝试之间的间隔。

     

重试参数可以包含以下子元素:

     
      
  • <强> task_retry_limit

         

    失败任务的最大重试次数。如果使用 task_age_limit 指定,则App Engine会重试该任务,直到   达到了两个极限。如果指定 0 ,则任务不会   重试。

  •   
  • task_age_limit(推送队列)

         

    重试失败任务的时间限制,从首次运行任务开始计算。该值是一个数字,后跟一个时间单位,   单位 s 秒, m 表示分钟, h 表示   小时,或 d 天。例如,值 5d 指定a   任务首次执行尝试后的五天限制。如果   通过 task_retry_limit 指定,App Engine会重试该任务,直到   达到了两个极限。

  •   
  • min_backoff_seconds(推送队列)

         

    在失败后重试任务之前等待的最小秒数。

  •   
  • max_backoff_seconds(推送队列)

         

    失败后重试任务之前等待的最大秒数。

  •   
  • max_doublings(推送队列)

         

    在增加变为常量之前,失败的任务重试之间的间隔将加倍的最大次数。该   常数是:2**max_doublings * min_backoff_seconds**

  •   

但是增长的模式将是渐进的 - 每次失败后加倍,你不能在重试之间获得重要的步骤增加。尽管如此,它可能是一个足够好的解决方案,不需要额外的编码。就个人而言,我会选择这种方法。

另一种方法是添加该逻辑以确定该执行是否是原始任务的最终重试,如果是,则将 new 相应的任务排入具有所需&#的不同队列上34;慢&#34;重试政策。我不确定这是你在问题中提到的并且想要避免的。