Celery --beat on Heroku vs Worker 和 Clock 进程

Posted

技术标签:

【中文标题】Celery --beat on Heroku vs Worker 和 Clock 进程【英文标题】:Celery --beat on Heroku vs Worker and Clock processes 【发布时间】:2014-10-18 21:02:52 【问题描述】:

我有一个定期任务,我正在使用 worker 对 heroku procfile 实施:

规范

web: gunicorn voltbe2.wsgi --log-file - --log-level debug
worker: celery -A voltbe2 worker --beat -events -loglevel info 

tasks.py

class PullXXXActivityTask(PeriodicTask):
    """
    A periodic task that fetch data every 1 mins.
    """
    run_every = timedelta(minutes=1)

    def run(self, **kwargs):
        abc= MyModel.objects.all()
        for rk in abc:
            rk.pull()
        logger = self.get_logger(**kwargs)
        logger.info("Running periodic task for XXX.")

        return True

对于这个周期性任务,我需要 --beat(我通过关闭它进行检查,它不会重复任务)。所以,在某种程度上,--beat 完成了时钟的工作 (https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes)

我担心的是:如果我将工作人员 heroku ps:scale worker=2 缩放到 2 倍 dynos,我会看到日志中有两个节拍在 worker.1 和 worker.2 上运行:

 Aug 25 09:38:11 emstaging app/worker.2: [2014-08-25 16:38:11,580: INFO/Beat] Scheduler: Sending due task apps.notification.tasks.SendPushNotificationTask (apps.notification.tasks.SendPushNotificationTask)
Aug 25 09:38:20 emstaging app/worker.1: [2014-08-25 16:38:20,239: INFO/Beat] Scheduler: Sending due task apps.notification.tasks.SendPushNotificationTask (apps.notification.tasks.SendPushNotificationTask) 

显示的日志是针对不同的周期性任务,但关键是两个工作测功机都从各自的时钟获取信号以执行相同的任务,而实际上应该有一个时钟在每 XX 秒后滴答作响决定要做什么,并将该任务交给负载最少的worker.n dyno

更多关于为什么单个时钟必不可少的信息在这里:https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes#custom-clock-processes

这是一个问题吗?如果是,如何避免?

【问题讨论】:

【参考方案1】:

你应该有一个单独的工作人员来处理节拍过程。

web: gunicorn voltbe2.wsgi --log-file - --log-level debug
worker: celery -A voltbe2 worker -events -loglevel info 
beat: celery -A voltbe2 beat 

现在您可以在不影响节拍的情况下扩展工作任务。

或者,如果您并不总是需要额外的进程,您可以继续在工作任务中使用 -B,但也可以使用第二个任务 - 例如,extra_worker - 通常设置为 0 dynos,但您可以根据需要扩大规模。重要的是始终将任务与​​节拍保持在 1 个进程

【讨论】:

谢谢@Daniel。因此,如果我理解正确,只要任何 Procfile 进程发出“节拍”,它就会在整个应用程序中传播,并且所有工作人员都能听到这个“节拍”? heroku 上是否有任何文档可以解释这一点? 这与 Heroku 没有任何关系,也不是其他工作人员正在听的节奏。相反,“节拍”作业只是将所有到期的作业放入队列中,然后由工作人员以完全正常的方式拾取它们。 @DanielRoseman 感谢您的回答,请您提供参考以供进一步阅读。我似乎在 heroku 文档上找不到任何内容。

以上是关于Celery --beat on Heroku vs Worker 和 Clock 进程的主要内容,如果未能解决你的问题,请参考以下文章

Celery Beat定时任务

celery beat 没有发送消息(使用 django-celery-beat)

django_celery_beat

django-celery-beat 垃圾邮件到期任务

django redis celery 和 celery beats 的正确设置

Celery-Beat:ACCESS_REFUSED - 使用身份验证机制 AMQPLAIN 拒绝登录