Spring Cloud Stream RabbitMQ несколько приемников - PullRequest
0 голосов
/ 11 октября 2018

Мне трудно понять, как RabbitMQ и Spring Cloud Stream работают вместе.Что я хочу сделать, это следующее (Базовое объяснение):

У меня есть производитель, который создает сообщения, такие как: SendEmail, ReceiveEmail и ErrorOccurred.Они пойдут на шину сообщений.Тогда у меня есть 3 потребителя.A LogService, Emailservice и ParserService.

EmailService получат все сообщения Email, LogService получит ErrorOccurred (также сгенерированный другими производителями)и сообщения EmailSend.Наконец, ParserService будет получать только сообщения ReceiveEmail.

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

spring:
  rabbitmq:
    host: localhost
    username: guest
    password: guest
  cloud:
    stream:
      bindings:
        output: # <-- Question 1
          destination: # <-- Question 2

Со стандартной привязкой интерфейса Source.class.

И EmailService:

spring:
  rabbitmq:
    host: localhost
    username: guest
    password: guest
  cloud:
    stream:
      bindings:
        input:
          destination: # <-- Question 3

И то же самое для LogService, как указано выше.

Вопрос 1: Я определил только один выход, но, очевидно, мне нужно2?Но тогда я не могу использовать «вход» в качестве названия канала, верно?И мне нужно настроить мои собственные имена каналов с Output("CHANNEL NAME HERE").Но что означает название этого канала?Я не вижу, чтобы название канала снова появлялось в веб-интерфейсе RabbitMQ или чем-то еще.Это просто внутреннее наименование приложения?

Вопрос 2: Насколько я понял, это обменное имя.Если я правильно читаю документы, мне нужен обмен типами тем для сообщений Email, так как у меня 3 получателя.У меня также есть 3 отдельные очереди тогда?Но как мне настроить 1 очередь, получающую только EmailReceived, 1 очередь, получающую все и 1 очередь EmailSend сообщений?

Вопрос 3: Нужно ли производить обмен для каждого отдельного события, которое я хочу отправить?Разве я не смогу подписаться на все email.* события?Если я использую его таким образом, я создаю очередь с таким точным именем и тему с тем же именем.Что не так, насколько я знаю.

Я хочу сделать это так, https://www.rabbitmq.com/tutorials/tutorial-five-spring-amqp.html. Но проблема в том, что они используют базовый RabbitMQ Spring AMQP, и я решил использовать SpringCloud Stream (так как он объявлен как инструмент для организации микросервисных коммуникаций и т. Д.).

Должен ли я использовать SCS или использовать библиотеку Spring-AMQP?если так, как я должен настроить это?Если мне нужно объяснить больше, пожалуйста, попросите разъяснений.Заранее спасибо!

1 Ответ

0 голосов
/ 11 октября 2018

На стороне производителя вам нужен только один пункт назначения;установите routingKeyExpression для маршрутизации в одну из 3 очередей на основе чего-либо в сообщении (например, заголовок - routing-key-expression=headers[route]).

Вы также можете иметь несколько выходных каналов, указывающих на один и тот же пункт назначения (но сдругое - буквальное - выражение ключа маршрутизации 'email.foo').

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

См. документацию .

...