Как настроить очередь так, чтобы все подписчики получали сообщения - Rabbit MQ

Я читаю книгу RabbitMQ в действии, все еще в главе 2, но одна вещь, о которой говорят авторы, меня озадачивает. Вы настраиваете обмен и отправляете сообщение, очередь слушают два абонента. Когда приходит первое сообщение, его получает первый подписчик, и сообщение удаляется после его подтверждения. Когда приходят следующие сообщения, они идут к следующему слушателю по кругу. Я подумал, если я отправляю сообщение, я хочу, чтобы все подписчики его получили. Мое понимание неверно?


person Nair    schedule 06.02.2012    source источник
comment
Взгляните на это, rabbitmq.com/tutorials/tutorial-three-java. html   -  person nylund    schedule 06.12.2012


Ответы (1)


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

Предполагая, что у вас есть тематический обмен и вы публикуете все сообщения с ключом маршрутизации, например, fred.interesting или fred.boring, тогда, если каждый подписчик объявит очередь с ключом привязки fred.*, то каждая очередь получит копию каждое сообщение. Единственная проблема заключается в том, как назвать очереди, хотя RabbitMQ может генерировать для вас уникальные имена, если вы хотите.

Если бы я делал это, у меня был бы процесс супервизора, который запускает и контролирует процессы потребителя сообщений. Супервизор назначит каждому процессу-потребителю имя очереди, такое как fred0001, fred0002, и отследит, какие имена используются. Подобные указанные имена упрощают использование инструментов управления или написание сценариев управления и мониторинга.

person Michael Dillon    schedule 06.02.2012
comment
Я бы (и действительно так) настроил бы своих подписчиков так, чтобы они несли личную ответственность за регистрацию своих собственных очередей с соответствующими ключами маршрутизации. Настройка их как самоудаляющихся очередей гарантирует, что после потери соединения с потребителем очередь также будет разорвана. - person Steve Martin; 07.02.2012