【发布时间】:2019-03-16 12:38:08
【问题描述】:
我无法掌握 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接口绑定。
还有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,而我选择使用 Spring Cloud Stream(因为它被宣传为进行微服务通信 atc 等的工具)。
我应该使用 SCS 还是应该使用 Spring-AMQP 库?如果是这样,我应该如何配置它?如果我需要解释更多,请要求任何澄清。提前致谢!
【问题讨论】:
标签: java spring spring-boot rabbitmq spring-cloud-stream