【问题标题】:One Celery beat, many workers?一个芹菜节拍,许多工人?
【发布时间】:2015-05-13 23:46:47
【问题描述】:

我想运行一个由多个工作人员共享的 DatabaseScheduler-backed celerybeat 实例。 Redis 是代理。只有一个工人会收到一个计划任务,还是所有工人都会收到一个计划任务?谢谢!

【问题讨论】:

    标签: python django redis celery message-queue


    【解决方案1】:

    您应该运行 celery beat 调度程序的单个实例,然后当它需要调度任务时,它会将消息放入消息代理队列(在您的情况下为 Redis)。队列默认为“celery”,但可以根据您的代码/设置为每个任务或每个任务实例配置。

    当您启动一个或多个工作人员时,您可以根据需要告诉每个工作人员要监听哪些队列,但默认情况下,他们只会再次监听“芹菜”队列上的消息。当消息被推送到队列时,第一个可用的工作人员将收到来自代理的推送通知并执行它。代理将确保一次仅将单个任务实例推送给一个工作人员。

    默认情况下,如果该工作人员在执行任务时崩溃,那么它将丢失。您还可以使用 CELERY_ACKS_LATE 设置更改该行为,这意味着如果工作人员崩溃,其当前任务将重新分配给下一个可用工作人员。

    【讨论】:

    • 还可以添加,CELERYY_ACKS_LATE 可以使用@app.task(acks_late=True)为每个任务配置