Подтвердить что ты не робот

Получить размер очереди в Pika (AMQP Python)

Простой вопрос, но Google или Pika с открытым исходным кодом не помогли. Есть ли способ запросить текущий размер очереди (счетчик элементов) в Pika?

4b9b3361

Ответ 1

Существует два способа получить размер очереди в протоколе AMQP. Вы можете использовать Queue.Declare или Basic.Get.

Если вы потребляете сообщения по мере их поступления с использованием Basic.Consume, вы не сможете получить эту информацию, если не отключите (тайм-аут) и не переустановите очередь, или не получите одно сообщение, но не получите его. В новых версиях AMQP вы можете активно запрашивать сообщение.

Что касается Pika, я не знаю специфики, но клиенты Python для AMQP были шипами на моей стороне. Часто вам нужны классы monkeypatch для получения необходимой вам информации или для того, чтобы позволить потребителю очереди использовать тайм-аут, чтобы вы могли делать другие вещи с периодичностью, такие как статистика записи или узнать, сколько сообщений находится в очереди.

Другой способ - отказаться от использования класса Pipe для запуска sudo rabbitmqctl list_queues -p my_vhost. Затем проанализируйте вывод, чтобы найти размер всех очередей. Если вы это сделаете, вам нужно будет настроить /etc/sudoers, чтобы не запрашивать обычный пароль sudo.

Я молюсь, чтобы кто-то еще с опытом Пики ответил на это, указав, как вы можете делать все, что я упомянул, и в этом случае я буду загружать Пику и пинать шины. Но если этого не произойдет, и у вас возникли трудности с monkeypatching Pika code, посмотрите на haigha. Я обнаружил, что их код намного проще, чем другие клиентские библиотеки Python AMQP, потому что они ближе подходят к протоколу AMQP.

Ответ 2

Я знаю, что этот вопрос немного стар, но вот пример этого с pika.

Что касается AMQP и RabbitMQ, если вы уже объявили очередь, вы можете повторно объявить очередь с пассивным флагом и сохранить все остальные параметры очереди одинаковыми. Ответ на это объявление declare-ok будет содержать количество сообщений в очереди.

Вот пример с pika 0.9.5:

import pika

def on_callback(msg):
    print msg

params = pika.ConnectionParameters(
        host='localhost',
        port=5672,
        credentials=pika.credentials.PlainCredentials('guest', 'guest'),
    )

# Open a connection to RabbitMQ on localhost using all default parameters
connection = pika.BlockingConnection(parameters=params)

# Open the channel
channel = connection.channel()

# Declare the queue
channel.queue_declare(
        callback=on_callback,
        queue="test",
        durable=True,
        exclusive=False,
        auto_delete=False
    )

# ...

# Re-declare the queue with passive flag
res = channel.queue_declare(
        callback=on_callback,
        queue="test",
        durable=True,
        exclusive=False,
        auto_delete=False,
        passive=True
    )
print 'Messages in queue %d' % res.method.message_count

Это напечатает следующее:

<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])>
<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])>
Messages in queue 0

Вы получаете количество сообщений от члена message_count.

Ответ 3

Вот как вы можете получить длину очереди с помощью pika (учитывая, что вы используете пользователь и пароль по умолчанию на localhost) замените q_name на ваше имя очереди.

import pika
connection = pika.BlockingConnection()
channel = connection.channel()
q = channel.queue_declare(q_name)
q_len = q.method.message_count

Ответ 4

Вы пробовали PyRabbit? У этого метода есть get_queue_depth() , который звучит так, как будто вы ищете.