Можно ли потреблять обмен в RabbitMQ? - PullRequest
4 голосов
/ 02 декабря 2011

Возможно, я задаю не тот вопрос здесь.

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

проблема заключается в том, что все примеры потребления, которые я вижу, требуют, чтобы у потребителя / подписки было определенное имя очереди, имои потребители не знают названий очередей, и им не нужно это знать.

почему я это делаю?две причины:

  1. Я могу иметь N из этих динамических категорий одновременно.Я бы хотел, чтобы очередь обслуживала эти категории одинаково.в настоящее время у нас есть одна очередь (msmq), которая принимает все эти категории и обслуживает их в FIFO (что означает, что некоторые категории испытывают недостаток в течение некоторого времени).

  2. Возможность обслуживать все категориив равной степени, а не fifo, позволяет мне придумать интересное QoS (по умолчанию я понимаю, что Rabbit будет выполнять циклическую обработку сообщений).

Итак, вернемся к моему вопросу (если оно действительно): возможно ли получать сообщения из очереди?

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

Если есть вариант с динамическими подписчиками, я хотел бы предложить два возможных решения:

Решение 1:

  • Использовать обмен темами.
  • Используйте флаг доставки обязательный при публикации сообщений в вашем обмене.
  • Если сообщение отклонено: создайте очередь, свяжите ее для конкретного ключа маршрутизации и запуститеподписчик в очереди повторно публикует отклоненное сообщение.
  • Используйте автоматическое удаление очередей, чтобы при остановке подписчика его очереди исчезали и весь процесс автоматического создания мог перезапуститься.

Решение 2:

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

Если динамические подписчики не доступны, товот что я предлагаю.Предполагая, что вы ограничены n подписчиками:

  • Определите стратегию, которая хэширует динамические категории в n ключах маршрутизации,
  • Использованиепрямой обмен,
  • Bind n очередей для него для n ключей маршрутизации,
  • Иметь одного подписчика на очередь.
0 голосов
/ 17 января 2012

С помощью AMQP вы публикуете сообщения на Exchange и используете сообщения из очереди. Не беспокойтесь о том, что означает «очередь» в других технологиях обмена сообщениями.

Мне кажется, что ваш сценарий может быть легко обработан с помощью обмена темами. Публиковать сообщения с ключами маршрутизации, такими как cat.silly, cat.older, cat.интересный Затем попросите потребителей объявить очередь, используя ключ привязки cat. *

Таким образом, все сообщения, опубликованные на бирже с любым префиксом, будут скопированы в очередь из-за подстановочного знака в ключе привязки. Если ваши потребители на самом деле используют циклический обмен, то есть сообщения не должны копироваться в несколько очередей, просто попросите всех потребителей использовать одно и то же имя очереди. Если каждый потребитель использует одно и то же имя очереди, вы можете скомпилировать его в свой код и не беспокоиться о его названии. Но когда вы хотите отладить поток сообщений, просто создайте получателя, который подписывается на очередь с именем catdebug с тем же ключом привязки, cat. *

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

Обмен темами - лучшее решение, которое стоит попробовать в первую очередь, потому что семантика прямого и разветвленного обмена может быть легко эмулирована.

...