django – 为什么我在Heroku上使用CloudAMQP拥有这么多Celery消息?

我在Heroku上运行的Django站点正在使用CloudAMQP来处理其计划的Celery任务. CloudAMQP正在注册比我有任务更多的消息,我不明白为什么.

例如,在过去几个小时内,我将运行大约150个计划任务(两个每分钟运行一次,另一个每五分钟运行一次),但CloudAMQP控制台的消息计数增加了大约1,300个.

我的相关Django设置:

BROKER_URL = os.environ.get("CLOUDAMQP_URL", "")
BROKER_POOL_LIMIT = 1
BROKER_HEARTBEAT = None
BROKER_CONNECTION_TIMEOUT = 30
CELERY_ACCEPT_CONTENT = ['json',]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_RESULT_EXPIRES = 7 * 86400
CELERY_SEND_EVENTS = False
CELERY_EVENT_QUEUE_EXPIRES = 60
CELERY_RESULT_BACKEND = None
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

我的Procfile:

web: gunicorn myproject.wsgi --log-file -
main_worker: python manage.py celery worker --beat --without-gossip --without-mingle --without-heartbeat --loglevel=info

查看Heroku日志,我只看到运行的预定任务数量.

RabbitMQ概述图在大多数情况下看起来像这样:

《django – 为什么我在Heroku上使用CloudAMQP拥有这么多Celery消息?》

我不明白RabbitMQ是否知道其他小组是否能够解决这个问题.我认为它们没有显示任何可以解释所有这些消息的明显因素.

我想至少了解额外消息是什么,然后是否有一种方法可以消除其中的部分或全部消息.

最佳答案 我几天前得到了同样的错误.

对于那些遇到同样问题的人,CloudAMQP的文档建议在启动芹菜时添加一些参数:

--without-gossip --without-mingle --without-heartbeat

“This will decrease the message rates substantially. Without these
flags Celery will send hundreds of messages per second with different
diagnostic and redundant heartbeat messages.”

事实上,到目前为止,这解决了这个问题!而且你最终只得到你发送的消息.

点赞