Используя RabbitMQ, есть ли способ просмотреть содержимое очереди без операции удаления из очереди?

В качестве способа изучения RabbitMQ и python я работаю над проектом, который позволяет мне распределять кодировку h264 между несколькими компьютерами. Основы выполнены, у меня есть демон, работающий на Linux или Mac, который подключается к очереди, принимает задания и кодирует их с помощью HandBrakeCLI и подтверждает сообщение после завершения кодирования. Я также создал простой инструмент для добавления элементов в очередь.

Теперь я хочу расширить возможности инструмента, помещающего элементы в очередь, чтобы я мог просматривать, что находится в очереди. Я знаю о возможности видеть, сколько элементов находится в очереди, но я хочу иметь возможность получать фактические сообщения, чтобы я мог показать, какой фильм или телешоу еще ждут кодирования. Идея состоит в том, что администратор очередей будет получать сообщения от клиентов кодировщика после завершения задания, а затем обновлять список очередей.

Я знаю, что существует запутанный способ синхронизации списка диспетчера очередей с фактической рабочей очередью, но я хотел бы, чтобы он был «постоянным» в том смысле, что я должен иметь возможность закрыть диспетчер очередей и снова открыть его позже, чтобы увидеть очередь .


person Dustin    schedule 15.01.2011    source источник
comment
Я получил это через твиттер - нет, очереди RabbitMQ - это чистые структуры FIFO, и заглянуть в них невозможно. Тем не менее, посмотрите на basic.consume/get с acks   -  person Dustin    schedule 15.01.2011


Ответы (3)


Просмотр очереди не поддерживается напрямую, но если вы объявите очередь без автоподтверждений и не будете подтверждать сообщения, которые вы получаете, то вы сможете увидеть в ней все. После того, как вы просмотрели, отправьте CANCEL на канал или отключитесь и снова подключитесь, чтобы все сообщения были повторно поставлены в очередь. Это увеличивает число в заголовках сообщений, но в остальном оставляет сообщения нетронутыми.

Я создал приложение, в котором порядок сообщений не был особенно важен, и я часто сканировал таким образом очередь. Если я находил проблему, я сбрасывал сообщения в файл, исправлял их и отправлял повторно.

Если вам нужно просмотреть одно или два сообщения время от времени, вы можете сделать это с помощью подключаемого модуля управления RabbitMQ.

Кроме того, если вам нужно только количество сообщений, вы можете получить его каждый раз, когда объявляете очередь или с помощью команды basic.get.

person Michael Dillon    schedule 15.02.2012
comment
Просто чтобы расширить количество сообщений, вы можете объявить очередь с параметромpassive=True, который не будет создавать очередь, если она не существует. Если это так, вы получите количество сообщений и потребителей. - person Dave Foster; 29.05.2012
comment
RabbitMQ имеет проприетарное расширение под названием Firehose Tracer, которое дает доступ ко всем опубликованным сообщениям. Подробности здесь: rabbitmq.com/firehose.html - person Tom Pohl; 06.07.2020

@MichaelDillon, основываясь на вашем ответе, чтобы облегчить жизнь другим, я привожу здесь пример no_ack:

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='Q.hello')


def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    # ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_consume(callback, queue='Q.hello')

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
person Tomasz    schedule 01.09.2017
comment
В этом случае ch.basic_ack(delivery_tag=method.delivery_tag) эффективно работает как команда удаления из очереди. +1 - person AlejandroVD; 23.09.2017
comment
Это очень полезно, но мне трудно найти способ сделать это, который не блокируется на неопределенный срок. По сути, я просто хочу один раз заглянуть в очередь с фиксированным количеством сообщений, и мне не нужно сидеть и ждать, пока поступит больше сообщений. Есть идеи? - person zjm555; 08.07.2020

То, что вы хотите сделать, называется просмотром очереди, хотя я понял из этого что RabbitMQ еще не поддерживает это.

person Lee at NCR    schedule 26.01.2011
comment
Напрямую не поддерживается, но если объявить очередь БЕЗ автоподтверждений и не АККировать сообщения, которые вы получаете, то в ней все видно. После того, как вы просмотрели, отправьте CANCEL на канал или отключитесь и снова подключитесь, чтобы все сообщения были повторно поставлены в очередь. Это увеличивает число в заголовках сообщений, но в остальном оставляет сообщения нетронутыми. - person Michael Dillon; 11.06.2011
comment
@MichaelDillon - этот комментарий должен быть ответом. - person cdeszaq; 14.02.2012
comment
@cdeszaq: да, ты прав. Я написал это как ответ с немного дополнительной информацией. - person Michael Dillon; 15.02.2012