芹菜 - 在Heroku上对工人和时钟进程

dow*_*123 12 django multithreading clock heroku celery

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

Procile

web: gunicorn voltbe2.wsgi --log-file - --log-level debug
worker: celery -A voltbe2 worker --beat -events -loglevel info 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

对于这个句号,我需要--beat(我通过关闭它来检查,并且它不重复任务).所以,在某种程度上,--beat时钟的工作(https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes)

我担心的是:如果我将工作者扩展heroku ps:scale worker=2为2x 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) 
Run Code Online (Sandbox Code Playgroud)

显示的日志是针对不同的周期性任务,但关键点是两个工作人员都从各自的时钟获取信号来执行相同的任务,而事实上应该有一个时钟滴答,每隔XX秒后决定要做什么做,并将该任务交给负载最小的worker.ndyno

有关单个时钟必不可少的详细信息,请访问:https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes#custom-clock-processes

这是一个问题,如何避免这种情况,如果是这样的话?

Dan*_*man 19

你应该为节拍过程有一个单独的工作人员.

web: gunicorn voltbe2.wsgi --log-file - --log-level debug
worker: celery -A voltbe2 worker -events -loglevel info 
beat: celery -A voltbe2 beat 
Run Code Online (Sandbox Code Playgroud)

现在,您可以在不影响节拍任务的情况下缩放工作任务.

或者,如果您不总是需要额外的过程,您可以继续在worker任务中使用-B,但也有第二个任务 - 比如extra_worker - 通常设置为0 dynos,但您可以将其扩展为必要.重要的是始终在1个过程中保持任务的节拍

  • 这与 Heroku 没有任何关系,也不是其他工人正在听的节拍。相反,“节拍”作业只是将所有到期的作业放入队列,然后由工作人员以完全正常的方式获取它们。 (2认同)