Phi*_*ord 4 django heroku rabbitmq celery cloudamqp
我在 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'
Run Code Online (Sandbox Code Playgroud)
我的档案:
web: gunicorn myproject.wsgi --log-file -
main_worker: python manage.py celery worker --beat --without-gossip --without-mingle --without-heartbeat --loglevel=info
Run Code Online (Sandbox Code Playgroud)
查看 Heroku 日志,我只能看到我期望的正在运行的计划任务的数量。
大多数情况下,RabbitMQ 概览图往往如下所示:
我对 RabbitMQ 的了解不够,无法知道其他面板是否能解决这个问题。我认为它们没有显示任何可以解释所有这些消息的明显内容。
我想至少了解额外的消息是什么,然后是否有办法消除其中的部分或全部。
几天前我遇到了同样的错误。对于那些遇到同样问题的人,CloudAMQP 的文档建议您在启动 celery 时添加一些参数:
--without-gossip --without-mingle --without-heartbeat
Run Code Online (Sandbox Code Playgroud)
“这将大大降低消息速率。如果没有这些标志,Celery 将每秒发送数百条消息,其中包含不同的诊断和冗余心跳消息。”
事实上,到目前为止,这解决了这个问题!您最终只会收到您发送的消息。