微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当大约有1000个任务排队时,Celery停止执行任务

如何解决当大约有1000个任务排队时,Celery停止执行任务

我们目前有一个Django服务器,该服务器将不同的异步任务排队,例如发送一批推送通知,发送电子邮件,处理事务和其他一些任务。该服务器将PeriodicTask排队,由Beat拾取并发送到Redis代理。然后,这由另一台服务器中的不同Celery工作者负责,该服务器最终执行了相关任务。这是我们的配置

CELERY_RESULT_BACKEND = "config.backend:CustomDataBaseBackend"
CELERY_ACCEPT_CONTENT = ["json"]
CELERY_TASK_SERIALIZER = "json"
CELERY_RESULT_SERIALIZER = "json"
CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"
CELERY_BEAT_SYNC_EVERY = 1
CELERY_IGnorE_RESULT = False
CELERY_SEND_EVENTS = True
CELERY_SEND_TASK_ERROR_EMAILS = False
CELERY_SEND_TASK_SENT_EVENT = True
CELERY_TASK_RESULT_EXPIRES = None
CELERY_BEAT_SCHEDULE = {
    'clean-expired': {
        'task': 'celery.clean_expired','schedule': crontab(hour=0),},}

在过去的几个月中,一切工作都很好。在高峰时段(上午10点至上午11点),我们总共可以处理大约4K个任务,但是最近我们的流量越来越大,而且有时工人会停止完成任务或做得非常慢。

节拍不断向Redis发送任务,因此情况只会变得更糟,并且一段时间后不会恢复正常,我必须禁用几乎所有待处理的任务并缓慢地重新启用它们,以使所有任务(或至少是关键任务)得以执行。

我还注意到,每当发生这种情况时,我检查芹菜花(Celery Flower)的时间点,都会对数小时前完成的某些任务执行数千次重试。我们确实对任务进行了重试,但是我不知道为什么在成功完成任务后会重试。如果在最大重试次数(3)之后任务失败,则会发生相同的事情,那么在检查花朵时,单个任务会导致很多失败。

那么,有谁知道可能发生的事情吗?我一直在猜测,但我真的不知道发生了什么。 Flower有时会将一些任务ID多次显示为待处理,我想这可以解释为什么某些任务尝试执行多次。我是否缺少一些配置参数,导致Celery从Redis多次读取相同的任务?

任何帮助或想法都将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。