RabbitMQ中的celeryev队列变得非常大

17
我正在使用RabbitMQ上的Celery。我已经发送了成千上万条消息到队列中,它们都被成功处理并且一切正常运行。然而,若干个RabbitMQ队列中的消息数量正在快速增长(队列中有数十万个项目)。这些队列的名称为celeryev.[...](请参见下面的截图)。这是适当的行为吗?这些队列的目的是什么?它们不应该被定期清理吗?是否有一种方法可以更经常地清理它们?我认为它们占据了相当大的磁盘空间。
5个回答

8
你可以使用 CELERY_EVENT_QUEUE_TTL celery 选项(仅适用于 amqp),该选项将设置消息的过期时间,之后它将从队列中删除。

这个链接现在是一个失效链接。你有更新的链接吗?现在是 https://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-event_queue_ttl 吗? - Ryan Gates

8

如果你遇到了 celeryev 队列变得非常大并威胁到 rabbitmq 服务器的磁盘空间,那么请注意接受的答案!这是我的建议。只需在 rabbitmq 实例上执行此命令:

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

这将限制任何以“celeryev”开头的队列为100万个条目。我试验了一下,发现一个卡住的flower实例会导致celeryev队列失控,设置CELERY_EVENT_QUEUE_TTL / CELERY_EVENT_QUEUE_EXPIRES并不能帮助控制队列的大小。

在我的测试中,我启动了一个flower进程,然后SIGSTOP它,并观察它的celeryev队列开始失控。这两个设置都没有起到任何作用。我确认SIGCONT启动flower进程会迅速将队列返回到0。我不确定为什么这两个旋钮没有帮助,但可能与RabbitMQ如何实现这两个设置有关。

首先,与CELERY_EVENT_QUEUE_TTL相对应的每条消息TTL仅在每个队列条目上建立过期时间 - AIUI它不会在过期时自动从队列中删除消息以节省空间。其次,与CELERY_EVENT_QUEUE_EXPIRES相对应的队列TTL表示它“...保证如果未使用至少过期时间,则将删除队列”。但是,我认为他们对“未使用”的定义可能过于严格,以至于无法处理负担过重、卡住或被杀死的flower进程。

编辑:不幸的是,这个建议的一个问题是set_policy ... apply-to queues只会影响现有队列,而flower可以和将创建队列可能会溢出。


5
你只需要对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


5

Celery使用以celeryev为前缀的队列(和交换机)进行监控,你可以按照自己的需求进行配置或者完全禁用(celery control disable_events)。


有没有办法减少或限制事件存储,而不是完全关闭它? - speedplane
你有尝试过将 --maxrate 和 --frequency 参数(或其他参数)放置在 CELERYEV_OPTS 中吗? - pinepain
你能使用--maxrate或--frequency选项吗?@pinepain - Manjit Kumar

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接