celerybeat - 多实例和监控

celerybeat - multiple instances & monitoring

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

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

  1. 是否可以 运行 多个 celerybeat 实例,这样任务就不会重复?
  2. 如何确保 celerybeat 始终启动并 运行ning?

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

看起来 celerybeat 的单个实例应该 运行ning。

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

最好让 celerybeat 运行 通过 supervisord 和 celery workers 一起使用,但这似乎不是正确的方法。

同时拥有单个 celerybeat 实例需要手动 provision/start 和监控。

回答您的 2 个问题:

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

  2. 正如您对 运行 芹菜工人和 celerybeat 工人提到的那样,我正在使用 supervisord 作为守护进程,因此他们应该始终处于启动状态并 运行ning。

我的主管配置:

[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

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

看看 celery.beat.Scheduler class,特别是 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

我刚刚发现这个解决方案可以作为 celery-beat 的替代品:RedBeat, 博客 post

虽然还没有使用它。