Python 分布式芹菜调度器

Python 分布式芹菜调度器,python,celery,Python,Celery,我正在为Python寻找一个类似于cron的分布式框架,并找到了芹菜。但是,文档中说“您必须确保一次只能为一个计划运行一个调度程序,否则最终会导致重复的任务”,Celery使用Celery.beat.PersistentScheduler将计划存储到本地文件 那么,我的问题是,除了默认实现之外,是否还有其他实现可以将计划“放入集群”并协调任务执行,以便每个任务只运行一次? 我的目标是能够在群集中的所有主机上以相同的时间表运行celerybeat 谢谢我想可能对celerybeat的工作有一些误解

我正在为Python寻找一个类似于cron的分布式框架,并找到了芹菜。但是,文档中说“您必须确保一次只能为一个计划运行一个调度程序,否则最终会导致重复的任务”,Celery使用Celery.beat.PersistentScheduler将计划存储到本地文件

那么,我的问题是,除了默认实现之外,是否还有其他实现可以将计划“放入集群”并协调任务执行,以便每个任务只运行一次? 我的目标是能够在群集中的所有主机上以相同的时间表运行celerybeat


谢谢

我想可能对celerybeat的工作有一些误解。Celerybeat不处理周期性任务;它只出版它们。它将周期性任务放在队列上,由celeryd工人处理。如果您运行一个celerybeat进程和多个celerybeat进程,那么任务执行将分布到集群中。

我们遇到了同样的问题,我们有三台服务器运行celerybeat。然而,我们的解决方案是只在一台服务器上运行Celerybeat,这样就不会创建重复的任务。为什么您希望Celerybeat在多台服务器上运行

如果您担心芹菜会倒下,只需创建一个脚本来监视Celerybeat进程是否仍在运行

$ ps aux | grep celerybeat

这将显示Celerybeat进程是否正在运行。然后创建一个脚本,如果您看到进程停止,请向系统管理员发送电子邮件。我们只在一台服务器上运行Celerybeat

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

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

一些背景:我们正在Kubernetes集群中运行Django应用程序(带有芹菜)。集群(EC2实例)和pod(~containers)是自动缩放的:简单地说,我不知道应用程序的实例何时运行,以及有多少实例在运行

您有责任只运行
celerybeat
的一个进程,否则,您的任务将重复[1]芹菜存储库中有此功能请求:[2]

要求用户确保只有一个celerybeat实例 存在于他们的集群中创建了一个实质性的实现 负担(造成单点故障或鼓励用户 滚动他们自己的分布式互斥)

celerybeat应提供一种机制,以防止意外 并发性,或者文档应建议最佳实践 接近

一段时间后,《芹菜》的作者因为缺乏资源而拒绝了这个功能请求[3]我强烈建议阅读Github上的整个线程。那里的人推荐这些项目/解决方案:

  • 使用锁定机构()
我没有尝试上面的任何操作(我不想在我的应用程序中有另一个依赖项,我不喜欢锁定任务/你需要处理故障转移等)

我最终在Kubernetes()中使用了CronJob

[1]

[2]


[3]

我明白,我想要的是能够运行多个celerybeat实例,这样我就可以避免如果运行celerybeat的主机停止调度的风险。例如,群集调度程序。这里不是真正的答案。这更像是一种变通方法。问题出现在部署过程中,假设您需要在多个同质节点上分发应用程序;注意只有一个节点运行调度器意味着所有节点都有一个部署过程,而另一个部署过程只针对“调度器节点”