Как узнать, было ли сообщение опубликовано в очереди, используя функции маршрутизации rabbitmq

Я работал над проектом, в котором для общения используется rabbitmq. Недавно мы обнаружили, что было бы намного масштабируемо, если бы мы использовали функцию маршрутизации кролика. Таким образом, мы привязываем очередь к нескольким ключам маршрутизации и используем обмен с типом direct.

Это работает как публикация / подписка. Таким образом, можно привязывать и отменять привязку очереди к различным событиям, чтобы потребители / подписчики получали только те сообщения, которые им интересны.

Конечно, производитель / издатель теперь использует ключ привязки (имя события) как routing_key, чтобы передать его реализации pika. Однако, когда он публикует что-то для несуществующей привязки, сообщение теряется, т.е. когда никто не связывает очередь для события foo, но какой-то издатель вызывает pika.basic_publish(..., routing_key='foo').

Итак, мой вопрос:

Можно ли узнать, действительно ли сообщение было опубликовано в очереди?

Что я пробовал:

  • Проверка возвращаемого значения pika.basic_publish. Всегда возвращает None.

  • Проверяем, есть ли исключение, когда мы пытаемся опубликовать несуществующую привязку. Здесь ничего нет.

  • Наличие дополнительной очереди для внеполосного управления (поскольку все подписчики управляются одним и тем же процессом). Мне такой подход не кажется идеальным.

Дополнительная информация

  • Поскольку я использую эту функцию маршрутизации, имена очередей генерируются кроликом. У меня нет проблем, если новый подход должен называть саму очередь.

  • Если предлагается новый подход, требующий привязки к обменам вместо очередей, я хотел бы их услышать, но я бы предпочел избегать их, поскольку на самом деле они не AMQP и являются расширением, реализованным rabbitmq.

  • версия pika - 0.9.5

  • версия rabbitmq - 2.8

Большое спасибо


person Fred    schedule 10.09.2012    source источник


Ответы (2)


Я считаю, что ответ на вашу проблему - это обязательный флаг в RabbitMQ:

Этот флаг сообщает серверу, как реагировать, если сообщение не может быть перенаправлено в очередь. В частности, если установлено «обязательное» и после выполнения привязок сообщение было помещено в нулевые очереди, то сообщение возвращается отправителю (с basic.return). Если бы обязательный не был установлен при тех же обстоятельствах, сервер молча сбросил бы сообщение.

Это в основном означает, что сообщение должно быть поставлено в очередь, и если оно не может быть перенаправлено, верните его мне. Взгляните на basic_publish в спецификации, чтобы включить его.

person kzhen    schedule 10.09.2012
comment
Это именно то, что я хочу. Идеально! - person Fred; 10.09.2012

Можно использовать обмен недоставленными письмами для хранения сообщений, которые не были использованы http://www.rabbitmq.com/dlx.html

Я не уверен, что это именно то, что вы ищете, но его можно использовать в качестве решения.

person robthewolf    schedule 10.09.2012