我很难掌握 RabbitMQ 和 Spring Cloud Stream 如何协同工作的知识。我想要做的是以下内容(基本解释):
我有一个生成消息的生产者,这些消息类似于:SendEmail、ReceiveEmail 和 ErrorOccurred。这些将继续在消息总线上。
然后我有 3 个消费者。一个 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
接口(interface)绑定(bind)。
和EmailService
:
spring:
rabbitmq:
host: localhost
username: guest
password: guest
cloud:
stream:
bindings:
input:
destination: # <-- Question 3
LogService
同上。
问题1:我只定义了一个输出,明明需要2个?但是我不能使用“输入”作为 channel 名称,对吗?我需要使用 Output("CHANNEL NAME HERE")
配置我自己的 channel 名称。但是这个 channel 名称是什么意思?我没有看到 channel 名称再次出现在 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,而我选择使用 Spring Cloud Stream(因为它被宣传为进行微服务通信等的工具)。
我应该使用 SCS 还是应该使用 Spring-AMQP 库?如果是这样,我应该如何配置呢?如果我需要解释更多,请要求任何澄清。提前致谢!
最佳答案
在生产者方面,您只需要一个目的地;设置 routingKeyExpression
根据消息中的某些内容(例如 header - routing-key-expression=headers[route]
)路由到 3 个队列之一。
您还可以让多个输出 channel 指向同一个目的地(但使用不同的 - 文字 - 路由键表达式 'email.foo'
)。
在消费者方面;你可以使用相同的目的地,但每个消费者都会有一个队列绑定(bind)到该交换机,在 bindingRoutingKey
旁边例如,email.#
.
参见 the documentation .
关于java - Spring Cloud Stream RabbitMQ 多个接收者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52759898/