celerybeat - 多实例和监控

12

我正在使用celery构建应用程序,最近我们有一个要求按计划运行特定任务。

我认为celerybeat非常适合这个需求,但我有一些问题:

  1. 是否可以运行多个celerybeat实例,以避免重复执行任务?
  2. 如何确保celerybeat始终处于运行状态?

到目前为止,我阅读了以下内容:https://github.com/celery/celery/issues/251https://github.com/ybrs/single-beat

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

我在AWS Elastic Beanstalk Docker容器中运行应用程序,而celery工作人员也是Docker容器(因此在需要时可快速扩展)。

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

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


1
Dmitry,你有想到解决办法吗?我也遇到了同样的问题。我在ElasticBeanstalk中有一个自动扩展的应用程序,但是定时任务调度程序运行了多次。 - jplaza
1
@jplaza 我们最终只使用了一个单一实例(docker化),并将其部署为AWS ECS的单一任务。 - DmitrySemenov
3个回答

10

回答你的两个问题:

  1. 如果运行多个celerybeat实例,则会出现重复任务,所以根据我所知,您应该只有一个单独的celerybeat实例。

  2. 像您提到的那样,我正在使用supervisord作为守护进程来运行celery工作者和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

2

我刚刚发现了一个替代celery-beat的解决方案:RedBeat,博客文章

虽然还没有使用过。


不同意负评-"没用过"听起来并不令人期待,但RedBeat显然是Heroku的专门解决这个确切问题的解决方案。 - cmc

-4

您可以运行多个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


5
我无法复现使用 djceleryDatabaseScheduler 出现的这种行为。我正在使用一个间隔调度 timedelta(seconds=5) 和一个 SQLite 数据库进行测试。如果有两个 beat 进程在运行,则任务会被插入队列并处理两次。 - Feuermurmel
2
我可能说错了,但这个“预订”过程不是只用于防止多个工作程序执行相同的作业吗?它与同步多个调度程序以避免启动重复作业没有任何关系。 - booshong
2
@Feuermurmel 我确认这一点。Celerybeat 只需运行一次。 - Karim N Gorjux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接