分布式Celery调度程序

Jon*_*röm 11 python celery

我正在寻找一个类似于Python的分布式cron框架,并找到了Celery.但是,文档说"你必须确保一次只有一个调度程序正在运行,否则你最终会遇到重复的任务",Celery使用celery.beat.PersistentScheduler将调度存储到本地文件.

所以,我的问题是,是否有另一种实现,而不是默认,可以将计划"放入集群"并协调任务执行,以便每个任务只运行一次?我的目标是能够在群集中的所有主机上运行具有相同计划的celerybeat.

谢谢

ill*_*nan 7

tl; dr:没有Celerybeat不适合您的用例。您只需运行的一个过程celerybeat,否则您的任务将重复。

我知道这是一个非常老的问题。我将尝试做一个小总结,因为我有相同的问题(在2018年)。

一些背景:我们正在Kubernetes集群中运行Django应用程序(与Celery一起使用)。集群(EC2实例)和Pod(〜容器)是自动缩放的:简单地说,我不知道何时,多少个应用程序实例在运行。

您有责任仅运行的一个进程celerybeat,否则,您的任务将重复。[1] Celery存储库中存在以下功能请求:[2]

要求用户确保整个群集中仅存在一个celerybeat实例,这会造成巨大的实施负担(创建单个故障点或鼓励用户使用自己的分布式互斥锁)。

celerybeat应该提供一种防止意外并发的机制,或者文档应该建议一种最佳实践方法。

一段时间后,此功能请求因缺少资源而被Celery的作者拒绝。[3]我强烈建议您在Github上阅读整个线程。人们在那里推荐这些项目/解决方案:

我没有尝试以上任何方法(我不想在我的应用程序中出现其他依赖关系,并且我不喜欢锁定任务/您需要处理故障转移等。)。

我最终在Kubernetes(https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/)中使用了CronJob 。

[1] celerybeat-多个实例和监视

[2] https://github.com/celery/celery/issues/251

[3] https://github.com/celery/celery/issues/251#issuecomment-228214951


Mar*_*vin 0

我认为对于 celerybeat 的作用可能存在一些误解。Celerybeat 不处理周期性任务;它只发布它们。它将周期性任务放入队列中以供 celeryd 工作人员处理。如果您运行单个 celerybeat 进程和多个 celeryd 进程,则任务执行将分布到集群中。