我正在使用带有RabbitMQ 3.6.14的celery 4.0.2,在连接到其中一台服务器上运行的rabbitmq服务器上配置了四个队列。
在最近在生产服务器上部署之前,一切都很好,但在那之后,RabbitMQ 生成了数千个不需要的队列,几个小时后,RAM 使用率变高(20G 或更高),芹菜日志从其他芹菜服务器miss heartbeat
并停止工作。
查看/var/lib/rabbitmq/mnesia/<server_name>/queues
显示数千个文件,rabbitmqctl list_queues
显示这些文件:
...
d143e25a2ffe4dbca881978d658739b1 1
6046df6f62bc422c981d416706fe4af2 1
4acc0d442fcd43a1b0ef379c370706b1 1
d24e24a680534e33a8572f38d29ea6cd 1
619f7c89b43c4400ad8bf4556ec968d6 1
ffa5a991910941d3a03b844f85880a26 1
41e66894e5c34ad5b32d3e4e6307138c 1
4dd03ac9171448759a7b964a91d7422b 1
24ff24e8fe074f5b979a9d4e4674ba08 1
16ff4b981c11422ca2d437a5fba05706 1
726271ce0ab04886acd7f59fd930dc82 1
c07a58e36fcd4623ae7c4210ef073bdf 1
....
我从未创建过这些文件(手动或在代码中)。此外,删除所有mnesia/queues
文件并重新启动 RabbitMQ 可以工作,但只能持续几个小时,并且再次出现相同的问题。
我真的很感激任何帮助。
我终于解决了这个问题。默认情况下,芹菜在任务完成后,会在以<id_of_the_task>
命名的队列中生成任务的结果。默认情况下,此队列将保留 24 小时,就我而言,每分钟生成数千个任务,因此,数百万个持久队列(24 小时)。
因此,您可以将以下内容放在 django 项目的settings.py
中(或者根据芹菜文档,在您的芹菜项目中celery.py
)。
CELERY_RESULT_PERSISTENT = False
CELERY_IGNORE_RESULT = True
CELERY_TASK_IGNORE_RESULT = True
CELERY_TASK_RESULT_EXPIRES = 60
`