【问题标题】:Celery and Celerybeat randomly start acting funkyCelery 和 Celerybeat 随机开始表现得很时髦
【发布时间】: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


【解决方案1】:

您的设置看起来不错。

您是在衡量任务完成的时间,而不是开始的时间吗?可能是您的任务需要很长时间甚至失败,因此不会被报告。

crontab 是低级别的,根据我的经验相当准确,所以我会先检查你的日志记录工具。

更新

另一个调试解决方案是开始对任务实施时间限制,以确保它们不会被锁定太久。 http://docs.celeryproject.org/en/latest/userguide/workers.html#time-limits

CELERYD_TASK_TIME_LIMIT = 300
CELERYD_TASK_SOFT_TIME_LIMIT = 260

【讨论】:

  • 问题是它们都是非常短的任务。最多几毫秒。尽管您提出了一个有趣的观点,但如果一项通常很快的任务需要一段时间,它会抛弃所有三个吗?我只使用一名工人。
  • 每个worker可能运行多个进程,不确定默认是什么,但示例通常建议多进程。例如,如果您的任务从同一个数据库列表中读取,它们可能都会以同样的方式卡住。与 Apple 推送服务器的 HTTP 通信通常会变慢。我建议您首先实施时间限制:docs.celeryproject.org/en/latest/userguide/…
  • 是的,我只是在调查那些。希望时间限制能解决问题。我可以把它们扔到 Django 的 settings.py 文件中,对吧?
  • 是的,这就是你放它们的地方!如果您希望任务在几毫秒内运行,您可能希望设置较低的限制:例如。最多 30 秒
  • 是的,我最终使用 30 秒作为软限制,使用 40 秒作为硬限制。我会密切关注它是否有效,谢谢!
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 2019-12-16
  • 2019-03-25
  • 2015-10-24
  • 1970-01-01
相关资源
最近更新 更多