我在rabbitmq上使用芹菜。我一直在向队列发送数千条消息,它们正在成功处理,一切正常。然而,几个rabbitmq队列中的消息数量正在增长相当大(队列中有数十万个项目)。队列被命名celeryev.[...]
(见下面的截图)。这是适当的行为吗?这些队列的目的是什么,不应该定期清除它们吗?有没有办法更频繁地清除它们,我认为它们占用了相当多的磁盘空间。
5 回答
您可以使用CELERY_EVENT_QUEUE_TTL
celery 选项(仅适用于 amqp),它将设置消息过期时间,之后它将从队列中删除。
对于遇到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'ingflower
进程会使队列迅速回到 0。我不确定为什么这两个旋钮没有帮助,但这可能与 RabbitMQ 如何实现这两个设置有关。
首先,Per-Message TTL对应的CELERY_EVENT_QUEUE_TTL
只是在每个队列条目上建立一个过期时间——AIUI它不会在过期时自动将消息从队列中删除以节省空间。其次,对应的队列 TTLCELERY_EVENT_QUEUE_EXPIRES
表示它“......保证队列将被删除,如果至少在到期期间未使用”。但是,我相信他们对“未使用”的定义可能过于严格,无法用于例如负担过重、卡住或死花过程。
编辑:不幸的是,这个建议的一个问题是它set_policy ... apply-to queues
只会影响现有的队列,而花可以并且将创建可能溢出的新队列。
Celery 使用celeryev
前缀队列(和交换)进行监控,您可以根据需要对其进行配置或完全禁用(celery control disable_events
)。
你只需要为你的 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.
您可以使用x-max-length队列声明参数限制 RabbitMQ 中的队列大小