17

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

rabbitmq控件截图

4

5 回答 5

8

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

于 2014-11-25T09:56:57.657 回答
7

对于遇到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只会影响现有的队列,而花可以并且将创建可能溢出的新队列。

于 2015-08-28T23:36:54.267 回答
5

Celery 使用celeryev前缀队列(和交换)进行监控,您可以根据需要对其进行配置或完全禁用(celery control disable_events)。

于 2013-07-22T04:47:23.863 回答
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

于 2016-07-29T22:22:24.823 回答
1

您可以使用x-max-length队列声明参数限制 RabbitMQ 中的队列大小

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

于 2013-07-24T16:02:26.277 回答