Проблемы с обменом фан-аутом RabbitMQ

Я могу создать разветвленную биржу с помощью публикации / подписки RabbitMQ Java учебник, и любой подключенный потребитель получит копию сообщения. Вместо того, чтобы объявлять обмен и привязку динамически / программно, я хотел бы создать обмен и привязку до подключения любых потребителей. Я сделал это через консоль управления RabbitMQ. Однако по какой-то причине мои потребители получают сообщения циклически, а не все копии сообщения. Что мне не хватает? Вот несколько фрагментов кода:

Издатель:

channel.basicPublish("public", "", null, rowId.getBytes("UTF-8"));

Потребитель:

QueueingConsumer consumer = new QueueingConsumer(channel);
            channel.basicConsume("myqueue", false, consumer);

... И в консоли управления RabbitMQ я создал обмен "public" типа "fanout" и установил привязку этого обмена к "myqueue".

Буду признателен за любую помощь!


person littleK    schedule 11.03.2013    source источник


Ответы (1)


Похоже, все ваши потребители подписываются на одну и ту же очередь. Когда несколько потребителей подписываются на одну и ту же очередь, RabbitMQ по умолчанию выполняет циклический перебор сообщений между всеми подписанными потребителями. См. «Циклическая диспетчеризация» в Учебнике RabbitMQ № 2: Рабочие очереди.

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

person Brian Zell    schedule 11.03.2013
comment
Этот ответ мне очень помог, спасибо! Я все думал, что каждый связанный потребитель получит копию сообщения, а не каждую связанную очередь. Это устранило мою проблему. Спасибо еще раз! - person littleK; 11.03.2013
comment
Мне не удалось найти это объяснение в документации. Они сказали мне использовать временное имя очереди, но не почему. Я подумал, что просто использую для всех именованную очередь global_messages, почему бы и нет? И тогда это не сработало. Настроить обмен на разветвление было только половиной дела. Это была ключевая информация, которой не хватало. Спасибо! - person CodeOrElse; 21.11.2019