RabbitMQ: отдельные партнеры потребителя и производителя при использовании только одного сервера очереди

мы собираемся использовать rabbitmq в нашем проекте, но столкнулись с проблемой, которую мы хотим отлаживать на наших машинах разработчика, поэтому ответное сообщение должно быть отправлено на машину, которая изначально отправила сообщение запроса. Как мы собираемся этого добиться, существует ли существующее решение в рамках spring-rabbitmq?

Мы рассмотрели несколько решений. например, объявить набор очередей для каждой машины, префикс имени очереди по имени машины. Это возможно?


person ThemeZ    schedule 27.12.2013    source источник


Ответы (1)


Определите набор очередей (очередь отладки A – Z) и привяжите их к обмену заголовками с атрибутами x-match=any, from=[A-Z], to=[A-Z] соответственно. Затем привяжите заголовки обмениваться на ваш основной рабочий обмен (одно или несколько), чтобы получать все интересующие вас сообщения, поэтому, когда ваш потребитель публикует ответ, он будут скопированы на ваш обмен данными отладки, а затем перенаправлены в соответствующую очередь.

 [sender X]   [     worker      ]                       [consumer on queue X]
     |            ^          |                 
 [request]        |      [response from=X, to=X]      [duped request from=X|                 
      \           |          |                        [duplicated response from=X, to=X]
       \  [request from=X]   |                                 ^
        v         |          V                                 |
      [working topic exchange]           -------> [debug headers exchange]
       /           |         \                   /           |         \
   {bindings by routing key mask}           {bindings by any headers from=[A-Z], to=[A-Z]}
     /             |           \               /             |           \
[working queue 1] ...  [working queue N]   [debug queue A]  ...  [debug queue Z]

Для привязки сообщений запроса и ответа вы можете использовать атрибуты сообщения applicationId и correlationId.

Обратите внимание, что сообщения запроса и ответа будут дублироваться в очереди отладки. Вы также можете указать отдельную очередь для сообщений запроса и ответа, привязав очереди к соответствию только определенным заголовкам, например x-match=all, from=[A-Z] или x-match=all, to=[A-Z], и публиковать ответы и сообщения запроса только с этими заголовками (только from или только to), но это зависит от вас.

Плюсы:

  • легко реализовать
  • требует минимальных изменений кода
  • легко включить / выключить
  • можно безопасно запускать в производственной среде

Минусы:

  • использовать больше ресурсов со стороны RabbitMQ

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

Плюсы:

  • пошаговый процесс отладки

Минусы:

  • сложно реализовать
  • может потребоваться много изменений кода
  • нарушить бизнес-логику
  • сложно включить / отключить
  • небезопасная производственная среда

p.s .: извините за график ascii

person pinepain    schedule 27.12.2013
comment
Спасибо за подробный ответ! Я не хочу дублировать ответ, потому что это может привести к конфликту бизнес-логики (мы используем базу данных разработчиков). Что касается шаблона RPC, уверен ли, что когда мой потребитель ожидает ответа, никакой другой потребитель не получит мой ответ? - person ThemeZ; 30.12.2013
comment
Ваши первоначальные потребители не получат никаких дублированных ответов, отладчик получит все копии. Что касается RPC - вы слушаете ответ в эксклюзивной очереди, поэтому никто, кроме текущего слушателя, не будет читать из него. См. rabbitmq.com/amqp-0-9. -1-reference.html # queue.declare.exclusive и rabbitmq .com / tutorials / tutorial-six-java.html для получения подробной информации (но я думаю, вы уже смотрели там). - person pinepain; 30.12.2013