【问题标题】:celerybeat - multiple instances & monitoringcelerybeat - 多个实例和监控
【发布时间】:2015-01-27 02:38:46
【问题描述】:

我正在使用 celery 构建应用程序,最近我们需要按计划运行某些任务。

我认为 celerybeat 非常适合这个,但我有几个问题:

  1. 是否可以运行多个 celerybeat 实例,从而不重复任务?
  2. 如何确保 celerybeat 始终正常运行?

到目前为止,我读到了这个: https://github.com/celery/celery/issues/251https://github.com/ybrs/single-beat

看起来应该运行一个 celerybeat 实例。

我在 AWS elasticbeanstalk docker 容器中运行应用程序,而 celery worker 也是 docker 容器(因此它可以在需要时快速扩展)。

最好让 celerybeat 和 celery 工人一起通过 supervisord,但似乎这不是正确的方法。

同时拥有单个 celerybeat 实例需要手动配置/启动和监控。

【问题讨论】:

  • 德米特里你能想出办法吗?我有同样的问题。我在 ElasticBeanstalk 中有一个自动缩放应用程序,并且节拍调度程序正在运行多次
  • @jplaza 我们最终将 AWS ECS 部署为单个任务的单个实例(dockerized)

标签: python python-2.7 celery celerybeat


【解决方案1】:

回答您的 2 个问题:

  1. 如果你运行多个 celerybeat 实例,你会得到重复的任务,所以你应该只有一个 celerybeat 实例。

  2. 我正在使用supervisord 来运行 celery worker 和 celerybeat worker 作为守护进程,因此它们应该始终处于启动和运行状态。

我的主管配置:

[program:my_regular_worker]
command=python2.7 /home/ubuntu/workspace/src/manage.py celery worker -Q my_regular_worker-queue_name -c 1 -l info --without-mingle
process_name=my_regular_worker
directory=/home/ubuntu/workspace/src
autostart=true
autorestart=true
user=ubuntu
stdout_logfile=/tmp/my_regular_worker.log
redirect_stderr=true



[program:my_celerybeat_worker]
command=python2.7 /home/ubuntu/workspace/src/manage.py celery worker -Q my_celerybeat_worker-queue_name -c 1 -l info --without-mingle -B -s /tmp/celerybeat-schedule

【讨论】:

    【解决方案2】:

    我刚刚发现这个解决方案是 celery-beat 替代品:RedBeat, 博客post

    还没用过。

    【讨论】:

    • 不同意反对票-“没有使用它”听起来从来没有希望,但 RedBeat 显然实际上是 Heroku 的人们针对这个确切问题专门构建的解决方案
    【解决方案3】:

    您可以运行多个 celery beat 实例,并且任务不会重复。

    看看 celery.beat.Scheduler 类,特别是 reserve() 函数。调度程序将在提交到网格执行之前保留一个任务。这可以防止另一个 celery beat 实例提交相同的任务。

    我们使用 MongoDB 作为计划任务的后备存储。这是一个示例文档,显示该任务已被其中一个调度程序保留。

    {
      "startdate": "2015-07-06 00:00:00", 
      "task": "cobalt.grid.tasks_facts.task_add", 
      "enddate": "2018-01-01 00:00:00", 
      "args": "[13.0, 42.0]", 
      "enabled": "True", 
      "last_run_at": "2015-08-13 15:04:49.058000", 
      "interval": "{u'every': u'1', u'period': u'minutes'}", 
      "relative": "False", 
      "total_run_count": "12", 
      "kwargs": "{}", 
      "reserved": "compute2:25703", 
      "_id": "ObjectId(55ccaf7784a3e752e73b08c2)", 
      "options": "{}"
    }
    

    http://celery.readthedocs.org/en/latest/reference/celery.beat.html#celery.beat.Scheduler

    【讨论】:

    • 我无法使用 djceleryDatabaseScheduler 重现此行为。我正在使用间隔计划timedelta(seconds=5)SQLite 数据库进行测试。如果两个beat 进程正在运行,任务将被插入队列并处理两次。
    • 我在这里可能是错的,但是这个“保留”过程不是只是为了让多个工人不执行相同的工作吗?它与同步多个调度程序没有任何关系,因此它们不会启动重复的作业。
    • @Feuermurmel 我确认。 Celerybeat 只能运行一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多