django - 继续重试 Celery 任务,仅在任务成功或达到最大重试次数时继续
问题描述
我有一个 Celery 任务,它通过指数退避重试失败。此任务将 Django 应用程序(称为“传输”)接收到的消息发布到第二个 Django 应用程序(称为“基础”)进行处理。这些消息必须按顺序处理,因此必须保持任务排队的顺序。然而,当一个任务失败时(因为无论什么原因,transport 都无法连接到 base),它就会被放到队列的后面,这显然是一个问题。
是否可以“阻止”芹菜队列,即。继续重试相同的任务,直到它成功或达到最大重试阈值,然后才移动到队列中的下一个任务?在我的情况下,我需要队列头部的任务继续尝试该 POST 直到它不再可以,并且在任何情况下都不应更改队列中任务的顺序,尽管我不确定这是否可以用 Celery 完成(如果是,如何)。
我遇到了这个先前的问题,它似乎描述了一个非常相似的问题,但它与我的用例并不完全相关。
解决方案
如果您的任务被链接在一起,celery 将在第一个任务完成之前处理后续任务。所以你可以这样做:
@task(bind=True, acks_late=True)
def retry_task(self, *args, **kwargs):
try:
# do stuff
except PossibleExceptions:
self.retry()
def next_task(*args, **kwargs):
# foo
task_signature = retry_task.si() | next_task.si()
task_signature.apply_async()
请阅读有关重试的文档。自从我上次查看它以来,它有很多新功能。
推荐阅读
- rxjs - What is the best way to patch fetched objects in RxJS?
- c# - DataGridViewCheckBox 不检查绑定数据
- github - 如何在 GitHub wiki 中提及用户?
- reactjs - 有什么办法可以让这变得更好吗?上传多个图像并将它们链接到 firestore db 对象
- javascript - 移动到其他月份时如何增加日期
- jquery - Drupal 7:自动加载下一篇文章
- javascript - 打字稿/Vue3 - 强制使用类型“任何”
- amazon-web-services - AWS 简单电子邮件服务为 XSS 转义用户输入
- wordpress - 我应该如何将 woocommerce_coupon_is_valid 过滤器用于弹出脚本标签?
- node.js - Google auth0 一键登录未正确发送数据