我有一个应用程序,其中有芹菜工人作为其中的一部分。当我部署时,这将杀死那些正在运行的进程。
因此,任务将已启动,但永远不会完成,并且在部署完成后不会重新启动。
避免此问题并在部署完成后重新启动这些任务的最佳方法是什么?
是否要在我的所有任务中使用acks_late?还是其他方式?
@celery.task(acks_late=True)
def my_task():
pass
作为部署过程的一部分,我们要做的是在我们要部署新代码时向集群中的所有 Celery 工作人员发送关闭信号。发送信号后,我们开始部署,部署成功完成后,我们将有一组新的工作线程订阅到一组预定义的队列。
由旧的 Celery 工作线程创建的工作进程可能会在接下来的几个小时(甚至几天!(内继续运行,但它们不会运行任何新计划的任务,因为它们在收到关闭信号时会从所有队列中取消订阅。
如您所见,此过程不涉及撤销和重新安排任务,因为这将是一个更复杂的过程,因为我们有时会在数百个 Celery 节点上同时运行数千个任务......