RabbitMQ中的celeryev队列变得非常大

时间:2013-07-22 01:31:49

标签: rabbitmq celery django-celery

我在rabbitmq上使用芹菜。我已经向队列发送了数千条消息,并且它们正在被成功处理,一切正常。但是,几个rabbitmq队列中的消息数量正在增长(队列中有数十万个项目)。队列名为celeryev.[...](见下面的截图)。这是恰当的行为吗?这些队列的目的是什么,不应该定期清除它们?有没有办法更频繁地清除它们,我认为它们占用了相当多的磁盘空间。

screenshot of rabbitmq control

5 个答案:

答案 0 :(得分:7)

您可以使用CELERY_EVENT_QUEUE_TTL芹菜选项(仅适用于amqp),这将设置消息到期时间,之后将从队列中删除。

答案 1 :(得分:6)

对于遇到celeryev队列变得非常大且威胁到rabbitmq服务器上的磁盘空间问题的其他人,请注意接受的答案!这是我的建议。只需在rabbitmq实例上发出此命令:

rabbitmqctl set_policy limit_celeryev_queues "^celeryev\." '{"max-length":1000000}' --apply-to queues

这会将以“celeryev”开头的任何队列限制为1百万条。我做了一些试验卡住flower实例导致失控的celeryev队列,并设置CELERY_EVENT_QUEUE_TTL / CELERY_EVENT_QUEUE_EXPIRES 帮助控制队列大小。

在我的测试中,我开始了一个flower进程,然后是SIGSTOP,然后看着它的celeryev队列开始逃跑。这两种设置都没有帮助。我确认了SIGCONT,flower进程会使队列迅速恢复为0。我不确定为什么这两个旋钮没有帮助,但它可能与RabbitMQ如何实现这两个设置有关。

首先,CELERY_EVENT_QUEUE_TTL对应的Per-Message TTL仅在每个队列条目上建立到期时间 - AIUI它不会自动从队列中删除消息以在到期时节省空间。其次,对应CELERY_EVENT_QUEUE_EXPIRES的{​​{3}}表示“......保证队列将被删除,如果至少在有效期内未使用”。但是,我认为他们对“未使用”的定义可能过于严格,无法为过度负担,卡住或死亡的花朵过程。

编辑:不幸的是,此建议的一个问题是set_policy ... apply-to queues只会影响现有的队列,而花可以并且会创建队列溢出。

答案 2 :(得分:4)

Celery对monitoring使用celeryev前缀队列(和交换),您可以根据需要配置它(或celery control disable_events)。

答案 3 :(得分:3)

您只需要为Celery设置配置。

如果您想避免Celery创建celeryev.*队列:

CELERY_SEND_EVENTS = False # Will not create celeryev.* queues

如果您需要这些队列用于监控目的(例如CeleryFlower),您可以定期清除它们:

CELERY_EVENT_QUEUE_EXPIRES = 60 # Will delete all celeryev. queues without consumers after 1 minute.

解决方案来自:https://www.cloudamqp.com/docs/celery.html

答案 4 :(得分:0)

您可以使用 x-max-length 队列声明参数

限制RabbitMQ中的队列大小

http://www.rabbitmq.com/maxlength.html