Google App Engine:task_retry_limit无效?
我有一个用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_limit
和 task_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=1
和task_age_limit=1s
(显然是最小值),你仍然会得到一次重试。 - 最小重试时间是20秒。如果你配置的延迟时间少于20秒,它会直接等20秒。
- 第一次重试之前的时间是不可预测的;似乎会随机延迟最多一分钟。之后,重试会按照你配置的时间表进行。