将Celery用作容错调度器

6 投票
2 回答
3195 浏览
提问于 2025-04-16 15:11

我想在一个分布式环境中使用celery和rabbitmq来做一个容错的调度器。这里说的容错是指,如果一个任务被分配给某个工作者,而这个工作者因为某种原因崩溃了,celery应该能够把这个任务重新安排给其他服务器。请问在有多个工作节点的环境中,怎么才能实现这个呢?

2 个回答

2

让每个工作者从同一个队列中获取消息,Rabbit会把消息轮流分配给这些工作者(消费者)。如果其中任何一个工作者在处理任务时出现问题,且还没来得及发送确认消息,那么这个消息会自动放回队列,接下来其他工作者就可以继续处理这个消息。这种方式保证了消息至少会被处理一次。

这个链接来自RabbitMQ网站,详细解释了这种处理方式,并提供了Python的示例代码。

5

你可能只需要设置一下 CELERY_ACKS_LATE 这个选项。

所谓的“晚确认”就是在任务执行完之后才确认这个任务消息,而不是像默认那样在任务开始之前就确认。这样做的好处是,如果工作进程崩溃了,Rabbit MQ 里仍然会保留这个消息。

这里有更多信息

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

撰写回答