11

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

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

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

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

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

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

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

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

4

3 回答 3

9

要回答您的 2 个问题:

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

  2. 正如你所提到的,我正在使用supervisordcelery 工人和 celerybeat 工人作为守护进程运行,因此它们应该始终启动并运行。

我的主管配置:

[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
于 2015-01-27T11:54:39.467 回答
1

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

不过还没用。

于 2017-11-29T14:43:32.090 回答
-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

于 2015-08-13T15:23:01.580 回答