【发布时间】:2014-09-18 22:25:46
【问题描述】:
我将 Celery 与我的 Django 应用程序一起使用,并且在大多数情况下,事情进展顺利。作为参考,这是我的 celerybeat 配置:
CELERYBEAT_SCHEDULE = {
'update-every-5-secs': {
'task': 'app1.tasks.task1',
'schedule': timedelta(seconds=5),
'args': (),
},
'archive-request-records-every-hour': {
'task': 'app0.tasks.archive_requests',
'schedule': crontab(minute=0, hour='*/1'),
'args': (),
},
'push-ios-background-every-5-minutes': {
'task': 'app0.tasks.push_ios_background',
'schedule': crontab(minute='*/5'),
'args': (),
},
}
我注意到,每隔 1-2 天,它就会随机完全不同步。例如,每 5 分钟运行一次的最后一个条目通常运行如下:1:00、1:05、1:10、1:15 等。
这是它今天早上所做的: 7:30, 7:35, 7:40, 7:46, 7:50, 8:03, 8:16, 8:32, 8:50, 9:13, 9:21, 9:26, 9:29, 9:32, 9:38, 9:47, 9:59, 10:08, 10:22, 10:24, 10:24, 10:24, 10: 24, 10:25, 10:25, 10:25, 10:25, 10:25, 10:25, 10:25, 10:25, 10:25, 10:25, 10:25, 10:26, 10:26、10:30、10:35、10:40...
它几乎看起来不同步,尝试一次全部弥补,然后重新恢复。起初我以为这只是侥幸,但它发生得太频繁了。我有需要按时运行的关键任务流程。
有什么方法可以防止这种情况发生吗?似乎人们在 Celery 上取得了巨大的成功,所以我真的很困惑。
【问题讨论】:
-
你在测量什么?这是 beat 服务发送消息的时间,还是工作人员接收任务的时间?
-
请注意,如果是后者(我怀疑:beat 不应该按此顺序发送消息),那么您必须考虑队列拥塞。假设 beat 在过去一个小时内发送了 12 条任务消息,但工作人员非常忙并且队列已满,这将导致您的周期性任务出现问题,最终将开始重叠。如果您有一个繁忙的集群,那么最好使用专门的工作人员来执行周期性任务。
标签: django celery django-celery cron-task celerybeat