Django 芹菜和芹菜开始随机表现出古怪的样子

Django 芹菜和芹菜开始随机表现出古怪的样子,django,celery,django-celery,cron-task,celerybeat,Django,Celery,Django Celery,Cron Task,Celerybeat,我在Django应用程序中使用芹菜,在大多数情况下,一切都很顺利。以下是我的celerybeat配置,仅供参考: CELERYBEAT_SCHEDULE = { 'update-every-5-secs': { 'task': 'app1.tasks.task1', 'schedule': timedelta(seconds=5), 'args': (), }, 'archive-request-records-every-

我在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:25、10:25、10:25、10:25、10:25、10:26、10:26、10:30、10:35、10:25

它看起来几乎失去了同步,试图一次性弥补,然后又重新恢复。起初我以为这只是一次侥幸,但现在发生得太频繁了。我有这方面的关键任务流程,需要按时运行


有没有办法防止这种情况发生?看来人们在芹菜方面已经取得了很多成功,所以我真的很困惑。

你的设置看起来不错

你是在衡量任务何时完成,而不是何时开始?这可能是因为您的任务需要很长时间,甚至失败,所以它们不会被报告

根据我的经验,
crontab
的级别较低且相当准确,因此我会先检查您的日志记录工具

更新

另一个调试解决方案是开始对任务实施时间限制,以确保它们不会被锁定太久


问题是它们都是很短的任务。最多几毫秒。尽管你提出了一个有趣的观点,但如果一项通常很快的任务需要一段时间,它会不会把这三项任务都甩了?我只使用一个worker。每个worker可以运行多个进程,不确定默认值是什么,但示例通常建议使用多个进程。例如,如果您的任务从同一个DB列表中读取,它们可能会以相同的方式被卡住。与苹果推送服务器的HTTP通信通常会减慢。我建议你从实施时间限制开始:是的,我只是在研究这些限制。希望时间限制能解决这个问题。我可以把它们放到Django的settings.py文件中,对吗?是的,就是你放它们的地方!如果您希望任务在几毫秒内运行,那么您可能需要设置较低的限制:例如,在mostYeah,我使用30秒作为软限制,使用40秒作为硬限制。我会注意看它是否有效,谢谢!你在测量什么?这是beat服务发送消息的时间,还是工作人员接收任务的时间?请注意,如果是后者(我怀疑:beat不应按此顺序发送消息),则必须考虑队列拥塞。比如说,如果beat在过去一小时内发送了12条任务消息,但工作人员非常忙,队列也排满了人,这将导致定期任务出现问题,最终会开始重叠。如果您有一个繁忙的集群,那么最好只为周期性任务使用一个专用的worker。
CELERYD_TASK_TIME_LIMIT = 300
CELERYD_TASK_SOFT_TIME_LIMIT = 260