当大约有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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...