Подпишитесь на группу потребителей, использующих RabbitMQ?

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

  • Может ли потребитель подписаться на группу издателей? Я предполагаю, что это возможно, если все издатели из группы, на которую мы хотим подписаться, отправят свои сообщения на обмен, который затем пересылает их подписчикам. Какой тип обмена будет наиболее подходящим для этого?
  • Можно ли подписаться на группу тем? Например, если у нас есть несколько тем, начинающихся с «данных», таких как data_1, data_2 и т. Д., Возможно ли, чтобы потребители подписывались на «данные *»? Я ничего не нашел по этому поводу, но из того, что я собрал о том, как работают биржи, это кажется невозможным.
  • Могут ли быть подтемы и даже подтемы? Насколько я понимаю до сих пор, использование темы или обмена заголовками, подтемы и подтемы в основном будут частью ключа маршрутизации, например data.diag.signal.

Надеюсь, я достаточно ясно выразился, и заранее благодарю вас за ваши ответы.


person Flxnt    schedule 05.10.2017    source источник


Ответы (1)


В своем ответе буду использовать примеры Java API.

Может ли потребитель подписаться на группу издателей?

Потребители RMQ не знают об издателях. Сущностями между ними являются очереди (и обмены со стороны производителя (издателя)). Java API com.rabbitmq.client.Channel.basicConsume(String, Consumer) допускает потребление только из одной очереди. Но вы можете передать один и тот же обратный вызов Consumer нескольким очередям

Альтернативой может быть создание очереди для каждого потребителя и использование channel.queueBind для привязки ее к обменам, производящим интересные сообщения. Или, что еще проще, попросите их опубликовать на каком-то общем обмене и привязать к нему.

Можно ли подписаться на группу тем? Например, если у нас есть несколько тем, начинающихся с «данных», таких как data_1, data_2 и т. Д., Возможно ли, чтобы потребители подписывались на «данные *»? Я ничего не нашел по этому поводу, но из того, что я собрал о том, как работают биржи, это кажется невозможным.

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

producer1 -> exchange-data-1 -> queue-data-1
producer2 -> exchange-data-2 -> queue-data-2
producer3 -> exchange-data-3 -> queue-data-3

Вы также можете создать новую биржу

producer1 -> exchange-data-1 --\ 
producer2 -> exchange-data-2 -> exchange-data-all -> queue-per-consumer -> your-consumer
producer3 -> exchange-data-3 --/

Могут ли быть подтемы и даже подтемы? Насколько я понимаю до сих пор, использование темы или обмена заголовками, подтемы и подтемы в основном будут частью ключа маршрутизации, например data.diag.signal.

В RMQ нет концепции подтем, но, как вы упомянули, вы можете использовать topic (или даже headers, для более богатого дизайна) биржи.

person Adam Kotwasinski    schedule 05.10.2017
comment
Спасибо за ответ, очень помог! Что касается подстановочных знаков для обмена темами, я понимаю, что можно подписаться на такие темы, как A.B. * или A. *. *, Но можно ли подписаться на что-то вроде A. *. C? - person Flxnt; 10.10.2017