我正在寻找一个分布式的类似cron的Python框架,我找到了芹菜。然而,文档中说“你必须确保一次只有一个调度程序在运行一个调度程序,否则你会得到重复的任务”,Celery使用的是celery.beat.PersistentScheduler,它将调度存储到一个本地文件中。
那么,我的问题是,除了默认实现之外,是否还有其他实现可以将调度“放入集群”,并协调任务执行,以便每个任务只运行一次?我的目标是能够在集群中的所有主机上以相同的时间表运行celerybeat。
谢谢
发布于 2018-01-08 10:52:02
tl;dr:No Celerybeat不适合您的用例。您必须只运行celerybeat
的一个进程,否则您的任务将会重复。
我知道这是一个非常古老的问题。我将尝试做一个小总结,因为我有相同的问题/问题(在2018年)。
一些背景知识:我们在Kubernetes集群中运行Django应用程序(使用Celery)。集群(EC2实例)和容器(~containers)是自动伸缩的:简单地说,我不知道应用程序何时以及有多少实例正在运行。
只运行celerybeat
的一个进程是您的责任,否则,您的任务将重复。1在Celery存储库中有这样一个特性请求:2
要求用户确保其集群中只有一个celerybeat实例,这会造成很大的实现负担(要么创建单个故障点,要么鼓励用户使用自己的分布式互斥锁)。
celerybeat应该提供一种机制来防止意外并发,或者文档应该建议一种最佳实践方法。
过了一段时间,这个功能请求被Celery的作者拒绝了,因为缺乏资源。我强烈建议阅读3上的整个线程。那里的人们推荐这些项目/解决方案:
我没有尝试上面的任何东西(我不想在我的应用程序中出现另一个依赖项,我不喜欢锁定任务,/you需要处理故障转移等等)。
我最终在Kubernetes (https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/)中使用了CronJob。
1 celerybeat - multiple instances & monitoring
2 https://github.com/celery/celery/issues/251
3 https://github.com/celery/celery/issues/251#issuecomment-228214951
发布于 2011-08-10 15:24:27
我认为可能对celerybeat的功能有一些误解。Celerybeat不处理定期任务;它只发布它们。它将周期性任务放在队列中,由celeryd工作进程处理。如果您运行单个celerybeat进程和多个celeryd进程,则任务执行将分布到集群中。
发布于 2011-11-23 18:16:38
我们也遇到了同样的问题,我们有三台服务器在运行Celerybeat。然而,我们的解决方案是只在一台服务器上运行Celerybeat,这样就不会创建重复的任务。为什么要让Celerybeat在多台服务器上运行?
如果您担心芹菜会崩溃,只需创建一个脚本来监视Celerybeat进程是否仍在运行。
$ ps aux | grep celerybeat
这将显示Celerybeat进程是否正在运行。然后创建一个脚本,如果您看到进程停止,请向您的系统管理员发送电子邮件。Here's a sample setup,我们只在一台服务器上运行Celerybeat。
https://stackoverflow.com/questions/7011950
复制