【问题标题】:Spring Cloud Stream RabbitMQ multiple receiversSpring Cloud Stream RabbitMQ 多个接收器
【发布时间】:2019-03-16 12:38:08
【问题描述】:

我无法掌握 RabbitMQ 和 Spring Cloud Stream 如何协同工作的知识。我想做的是以下(基本解释):

我有一个产生消息的生产者,例如:SendEmail、ReceiveEmail 和 ErrorOccurred。这些将在消息总线上进行。 然后我有3个消费者。 LogServiceEmailserviceParserService

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


    【解决方案1】:

    在生产者方面,您只需要一个目的地;根据消息中的某些内容(例如标头 - routing-key-expression=headers[route]),将 routingKeyExpression 设置为路由到 3 个队列之一。

    您还可以有多个输出通道指向同一个目的地(但使用不同的 - 文字 - 路由键表达式 'email.foo')。

    在消费者方面;您可以使用相同的目的地,但每个消费者将有一个绑定到该交换的队列,将bindingRoutingKey 放在例如email.# 旁边。

    the documentation

    【讨论】:

    • 谢谢,我今天会试试这个。我会及时通知你
    • @garyrussell 在消费者方面;是否可以配置将多个交换绑定到单个队列?
    • 不要在 cmets 中就旧答案提出新问题。提出一个包含更多细节的新问题。简单的答案是肯定的;但您需要提供更多上下文。交易所不受队列约束;队列绑定到交换。
    猜你喜欢
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 2017-11-24
    • 2021-02-17
    • 2019-03-27
    相关资源
    最近更新 更多