西芹杂烩

2024-10-01 15:46:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为Python寻找一个类似cron的分布式框架,并找到了celeri。然而,文件上说“你必须确保一次只有一个调度程序在运行,否则你会有重复的任务”,Celery正在使用celery.beat.PersistentScheduler将计划存储到本地文件。在

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

谢谢


Tags: 文件程序框架目标分布式集群时间表调度
3条回答

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

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

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

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

Requiring the user to ensure that only one instance of celerybeat exists across their cluster creates a substantial implementation burden (either creating a single point-of-failure or encouraging users to roll their own distributed mutex).

celerybeat should either provide a mechanism to prevent inadvertent concurrency, or the documentation should suggest a best-practice approach.

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

我没有尝试从上面的任何东西(我不想在我的应用程序的另一个依赖性,我不喜欢锁定任务/你需要处理故障转移等)。在

我最后在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

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

如果您担心Celery会崩溃,只需创建一个脚本来监视Celerybeat进程仍在运行。在

$ ps aux | grep celerybeat

这将显示Celerybeat进程是否正在运行。然后创建一个脚本,如果你看到进程停止,给你的系统管理员发邮件。Here's a sample setup我们只在一台服务器上运行Celerybeat。在

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

相关问题 更多 >

    热门问题