【问题标题】:Distributed Celery scheduler分布式 Celery 调度器
【发布时间】:2011-10-24 03:02:33
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: python celery


    【解决方案1】:

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

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

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

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

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

    celerybeat 应该提供一种机制来防止无意 并发,或者文档应该建议一个最佳实践 接近。

    一段时间后,这个功能请求被 Celery 的作者以资源不足为由拒绝了。 [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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我明白,我想要的是能够运行多个 celerybeat 实例,这样我就可以避免运行 celerybeat 的主机出现调度停止的风险。 IE。一个集群调度器。
      【解决方案3】:

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

      如果您担心 Celery 出现故障,只需创建一个脚本来监控 Celerybeat 进程是否仍在运行。

      $ ps aux | grep celerybeat
      

      这将显示 Celerybeat 进程是否正在运行。然后创建一个脚本,如果您看到该进程已关闭,请向您的系统管理员发送电子邮件。 Here's a sample setup 我们只在一台服务器上运行 Celerybeat。

      【讨论】:

      • 这里不是真正的答案。这更像是一种解决方法。部署过程中出现问题,假设您需要将应用程序分布在多个同构节点上;注意只有一个节点运行调度程序意味着有一个针对所有节点的部署过程和另一个仅针对“调度程序节点”的部署过程
      猜你喜欢
      • 2021-05-31
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 2016-05-03
      • 1970-01-01
      • 2012-01-29
      相关资源
      最近更新 更多