我有一个系统,它有重要的长时间运行的任务,这些任务由Celery工作人员执行。假设我们已经使用k8s或docker-compose部署了我们的应用程序。如何在生产中更改芹菜工人的代码而不丢失他们当前正在执行的任务?换句话说,我想要一种优雅的自动化方式来和新员工一起执行所有未完成的任务。
我使用Redis 4.3.3作为代理,我的Celery版本是5.2.7。
我已经添加了result_backend并尝试了以下设置,但Celery在我运行";docker compose restart worker_service_name";。
CELERY_ACKS_LATE = True
CELERY_TASK_REJECT_ON_WORKER_LOST = True
这个答案应该提供一些关于在Kubernetes上运行的信息。
此外,我建议添加(doc(:
CELERYD_PREFETCH_MULTIPLIER = 1
一次要预取的邮件数乘以并发进程。默认值为4(每条消息四条过程(。默认设置通常是一个不错的选择,但是,如果队列中有运行时间很长的任务,您必须启动工人,注意第一个启动的工人将收到最初消息数量的四倍。因此,任务可能不是公平地分配给工人。
要禁用预取,请将worker_prefetch_multiplier设置为1。更改设置为0将允许工作人员继续消耗尽可能多的消息。