我在rabbitmq上使用芹菜。我已经向队列发送了数千条消息,并且它们正在被成功处理,一切正常。但是,几个rabbitmq队列中的消息数量正在增长(队列中有数十万个项目)。队列名为celeryev.[...]
(见下面的截图)。这是恰当的行为吗?这些队列的目的是什么,不应该定期清除它们?有没有办法更频繁地清除它们,我认为它们占用了相当多的磁盘空间。
答案 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.
答案 4 :(得分:0)
您可以使用 x-max-length 队列声明参数
限制RabbitMQ中的队列大小