获取 RabbitMQ 队列中的消息数

Posted

技术标签:

【中文标题】获取 RabbitMQ 队列中的消息数【英文标题】:Getting number of messages in a RabbitMQ queue 【发布时间】:2013-05-17 11:15:29 【问题描述】:

我们使用amqplib 发布/使用消息。我希望能够读取队列上的消息数量(理想情况下,既已确认又未确认)。这将允许我向管理员用户显示一个漂亮的状态图,并检测某个组件是否跟不上负载。

我在 amqplib 文档中找不到任何关于读取队列状态的信息。

有人能指出正确的方向吗?

【问题讨论】:

查看这个答案***.com/questions/8192584/… 感谢@mike,当我不得不在 C# 中重新实现其中的一些内容时,这主要是我最终要做的。对于 Python 方法,我最终点击了 rabbitmq-admin 插件并查询它。无论如何,我很感激这个指针。 【参考方案1】:

使用 Java API,您可以执行以下操作:

channel.queueDeclarePassive(queueName).getMessageCount()

我相信这也适用于 amqplib(根据https://code.google.com/p/py-amqplib/source/browse/amqplib/client_0_8/channel.py#1356 似乎queue_declare() 返回一个带有消息计数的元组)

如果您需要更精确的指标(尤其是 nack 消息计数),则需要使用 rabbitmqctl 或 rabbitmq_management。由于它的 HTTP API,Rabbitmq_management 可能是一个不错的选择。更多信息:http://www.rabbitmq.com/management.html

【讨论】:

“问:使用 Python 我如何...” - “答:使用 Java 你会...” -> -1 截至今天,OP 中未提及Python amqplib 是一个 python 库,问题 is 标记为 Python,但我同意我本可以更清楚一些,因此对造成的混淆表示歉意【参考方案2】:

使用鼠兔:

import pika

pika_conn_params = pika.ConnectionParameters(
    host='localhost', port=5672,
    credentials=pika.credentials.PlainCredentials('guest', 'guest'),
)
connection = pika.BlockingConnection(pika_conn_params)
channel = connection.channel()
queue = channel.queue_declare(
    queue="your_queue", durable=True,
    exclusive=False, auto_delete=False
)

print(queue.method.message_count)

使用 PyRabbit:

from pyrabbit.api import Client
cl = Client('localhost:55672', 'guest', 'guest')
cl.get_messages('example_vhost', 'example_queue')[0]['message_count']

使用 HTTP

语法:

curl -i -u user:password http://localhost:15672/api/queues/vhost/queue

例子:

curl -i -u guest:guest http://localhost:15672/api/queues/%2f/celery           

注意:默认虚拟主机是/,需要转义为%2f

使用 CLI:

$ sudo rabbitmqctl list_queues | grep 'my_queue'

【讨论】:

PyRabbit 解决方案从队列中检索消息。我想你想改用cl.get_queue("example_vhost", "example_queue")['messages'] 如何获得队列中未确认消息的数量? 对于 pika:把这个留在这里,因为它咬了我,花了我几个小时。如果消费者没有预取太多消息,这只是消息的“真实”数量,理解这一点很重要。有关prefetch_count,请参阅pika.readthedocs.io/en/stable/modules/…。【参考方案3】:

按照 ChillarAnand 的答案,您可以轻松获得价值。数据在对象中。

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
            host='localhost',
            port=5672,
            credentials=pika.credentials.PlainCredentials('guest', 'guest'),
        )
channel = connection.channel()
print(channel.queue_declare(queue="your_queue", durable=True,  exclusive=False,
                  auto_delete=False).method.message_count)

你会得到准确的消息编号

【讨论】:

为什么一年多后你才复制 Chillar 的答案? 当我回答时,这是一个不同的答案。查看编辑日志...

以上是关于获取 RabbitMQ 队列中的消息数的主要内容,如果未能解决你的问题,请参考以下文章

获取 RabbitMQ 队列中的消息数

Rabbit MQ部署步骤

RabbitMQ管理台Purge大量消息堆积队列风险

01-初识消息队列MQ&&Rabbit相关概念介绍

使用rabbitmq手动确认消息的,定时获取队列消息实现

接收订单用redis做缓存好还是rabbit做消息队列好