Google App Engine:task_retry_limit无效?

11 投票
3 回答
2721 浏览
提问于 2025-04-16 14:50

我有一个用Python写的GAE应用。

我希望我的任务在失败时能停止运行,或者最多只重试一次。现在,它们一直在运行,完全不管我的yaml文件里是怎么设置的!

这是queue.yaml中的一段内容:

 - name: globalPurchase
   rate: 10/s
   bucket_size: 100
   retry_parameters:
     task_retry_limit: 1

如果globalPurchase任务出现500错误代码,它会一直重试,直到成功,并在日志中显示以下信息:

“队列‘globalPurchase’中的任务‘task14’失败,错误代码为500;将在30秒后重试”

为什么task_retry_limit并没有被实际使用呢?

3 个回答

2

如果你不想让任务重试,就应该把 task_retry_limit 设置为零。同时,你还需要配合使用 task_age_limit。这个应用引擎的任务队列重试逻辑是通过 task_try_limittask_age_limit 的组合来决定什么时候停止重试的。

5

我也遇到过同样的问题,奇怪的是,过了几个小时之后,它似乎就正常工作了... 也许是需要一些时间让GAE刷新一下??

无论如何,我用的设置是:

# configure the default queue
- name: default
  rate: 1/s
  retry_parameters:
    # task will stop retrying ONLY when BOTH LIMITS ARE REACHED
    task_retry_limit: 1
    task_age_limit: 1s
7

我也遇到过同样的问题。这个领域的文档和工具都不太完善,不过我发现了一些事情:

  • 在开发服务器上,重试参数没有任何效果。我尝试了很多不同的组合,但结果总是每30秒无限重试。参数在我部署到生产服务器时才生效。
  • 我还没找到一种方法可以完全禁用重试(除了确保我的处理程序不抛出异常)。
    • 如果设置 task_retry_limit=0,它仍然会重试。
    • 如果设置 task_retry_limit=0 并且设置了 task_age_limit,那么队列配置会被拒绝,并提示 task_retry_limit 必须是正数。
    • 同样,如果 task_age_limit=0,也会报错。
    • 如果你设置 task_retry_limit=1task_age_limit=1s(显然是最小值),你仍然会得到一次重试。
  • 最小重试时间是20秒。如果你配置的延迟时间少于20秒,它会直接等20秒。
  • 第一次重试之前的时间是不可预测的;似乎会随机延迟最多一分钟。之后,重试会按照你配置的时间表进行。

撰写回答