如果芹菜工人死得很惨,工作会重试吗?

Mat*_*tin 5 rabbitmq redis celery

如果工作人员运行的服务器死机,有没有办法重试芹菜作业?我不只是指执行作业的子进程,而是整个服务器变得不可用。

我尝试使用 RabbitMQ 和 Redis 作为代理。在这两种情况下,如果当前正在处理作业,则它会被完全遗忘。当一个 worker 重新启动时,它甚至不会尝试重新处理作业,看看 Rabbit 或 Redis,它们的队列都是空的。结果后端也是空的。

看起来工作人员获取了消息并假设如果子进程失败它将把它放回去,但如果工作人员也死了,它就不能把它放回去。

(是的,我在一个每年都会发生不止一次这种情况的环境中工作,我不想失去任务)

Mat*_*tin 7

从理论上讲, settask_acks_late=True应该可以解决问题。(文档)

使用 Redis 代理,任务将在 之后重新交付visibility_timeout,默认为一小时。(文档)

使用 RabbitMQ,一旦 Rabbit 注意到工人死亡,任务就会重新交付。