重试丢失或失败的任务(芹菜、Django和RabbitMQ)

重试丢失或失败的任务(芹菜、Django和RabbitMQ),rabbitmq,celery,django-celery,Rabbitmq,Celery,Django Celery,有没有办法确定任务是否丢失并重试 我认为丢失的原因可能是调度程序错误或工作线程崩溃 我计划重试,但我不确定如何确定哪些任务需要退役 如何使这一过程自动化?我可以使用自己的自定义计划程序来创建新任务吗 编辑:我从文档中发现RabByMQ从不松动任务,但是当任务线程在任务执行的中间崩溃时会发生什么?< /P> < P>你需要设置< /P> 芹菜迟收=正确 延迟确认意味着任务消息将在任务执行后得到确认, 不仅仅是之前,这是默认行为。 这样,如果工作进程崩溃,MQ仍将保留消息 显然,如果同时发生完全崩

有没有办法确定任务是否丢失并重试


我认为丢失的原因可能是调度程序错误或工作线程崩溃

我计划重试,但我不确定如何确定哪些任务需要退役

如何使这一过程自动化?我可以使用自己的自定义计划程序来创建新任务吗


<>编辑:我从文档中发现RabByMQ从不松动任务,但是当任务线程在任务执行的中间崩溃时会发生什么?< /P> < P>你需要设置< /P> 芹菜迟收=正确

延迟确认意味着任务消息将在任务执行后得到确认, 不仅仅是之前,这是默认行为。 这样,如果工作进程崩溃,MQ仍将保留消息

显然,如果同时发生完全崩溃(兔子+工人),则无法恢复任务,除非您在任务开始和任务结束时实现登录。 就我个人而言,每次任务开始时我都在mongodb中写一行,任务完成时写另一行(独立于结果),这样我可以通过分析mongo日志知道哪个任务被中断

您可以通过重写芹菜基本任务类的方法
\uuuuu call\uuuuu
after\u return
轻松完成此操作

下面是我的一段代码,它使用taskLogger类作为上下文管理器(具有入口和出口点)。 taskLogger类只是在mongodb实例中写入一行包含任务信息的内容

def\uuu调用(self,*args,**kwargs):
“”“在芹菜任务中,此函数调用run方法,您可以在此处
在运行任务“”之前设置一些环境变量
#将上下文管理器个人化
self.taskLogger=任务记录器(args、kwargs)
self.taskLogger.\uuuu输入
返回self.run(*args,**kwargs)
返回后的def(self、status、retval、task_id、args、kwargs、einfo):
#上下文管理器的退出点
self.taskLogger.__退出__(状态、返回、任务id、args、kwargs、einfo)

我希望这有助于消除关于芹菜的两个疑问(如果有的话)
cellery
如何(如果有的话)
cellery
确保同一个
任务不被多个
工作者拾取?[2] 如果芹菜
,那么它们运行多次有什么好处?(对于第二个问题,事实上他们说没问题,但我正在寻找明确的肯定)即使是ack_late,代理也知道消息已被拾取,因此永远不会从其他工作人员处拾取。我应该在项目中的何处编写上述代码块。有什么想法吗?