我正在使用芹菜构建应用程序,最近我们需要按计划运行某些任务。
我认为芹菜非常适合这个,但我有几个问题:
- 是否可以运行多个 celerybeat 实例,以便任务不重复?
- 如何确保芹菜节拍始终正常运行?
到目前为止,我读到了这个:https://github.com/celery/celery/issues/251和https://github.com/ybrs/single-beat
看起来应该运行芹菜节拍的单个实例。
我在 AWS elasticbeanstalk docker 容器中运行应用程序,而 celery worker 也是 docker 容器(因此在需要时可以快速扩展)。
最好让芹菜节拍与芹菜工人一起通过主管,但这似乎不是正确的方法。
同时,拥有该单个 celerybeat 实例将需要手动配置/启动和监控。
回答您的 2 个问题:
- 如果您运行多个 celerybeat 实例,
则会收到重复的任务,因此您应该只有一个 celerybeat 实例。
正如你提到的,我正在使用
supervisord
来运行芹菜工人和芹菜工人作为恶魔,所以他们应该始终启动和运行。
我的主管配置:
[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
我刚刚发现这个解决方案作为芹菜节拍的替代品:RedBeat,博客文章
不过还没有使用它。
您可以运行多个芹菜节拍实例,并且任务不会重复。
看看 celery.beat.Scheduler 类,特别是 reserve() 函数。 调度程序将在将任务提交到网格执行之前保留任务。 这可以防止另一个芹菜节拍实例提交相同的任务。
我们使用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