如何为生产者设置路由键

Posted

技术标签:

【中文标题】如何为生产者设置路由键【英文标题】:Howto set routing key for producer 【发布时间】:2017-08-30 04:41:39 【问题描述】:

我正在为基于 Spring Cloud Stream 的应用程序提供以下测试场景。 我的应用程序有一个主题,有两个队列。第一个队列的 BindingKey 命名为“cities”,第二个队列的绑定键为“persons”。

请问如何为 Spring Cloud Stream Rabbit 生产者设置路由键???区分消息将在哪里消费?

这是我的绑定配置:

spring.config.name=streaming

spring.cloud.stream.bindings.citiesChannel.destination=streamInput
spring.cloud.stream.bindings.citiesChannel.group=cities
spring.cloud.stream.rabbit.bindings.citiesChannel.consumer.durableSubscription=true
spring.cloud.stream.rabbit.bindings.citiesChannel.consumer.bindingRoutingKey=cities

spring.cloud.stream.bindings.personsChannel.destination=streamInput
spring.cloud.stream.bindings.personsChannel.group=persons
spring.cloud.stream.rabbit.bindings.personsChannel.consumer.durableSubscription=true
spring.cloud.stream.rabbit.bindings.personsChannel.consumer.bindingRoutingKey=persons

spring.cloud.stream.bindings.producingChannel.destination=streamInput

在发布到 produceChannel 时如何区分消息将发送到哪里(城市或人员队列)的唯一方法是通过 "spring.cloud.stream.bindings.productionChannel.producer.requiredGroups " 属性,但这是非常不可用。因为我不想知道我的消息将要到达的队列...这是 AMPQ 反模式。

我不想要更简单的东西,然后在发布到 producerChannel 时具有类似的功能,例如通过 RabbitTemplate.setRoutingKey(String routingKey) 方法...:-(

【问题讨论】:

【参考方案1】:

在生产者端使用routingKeyExpression - 请参阅the documentation。

因为它是一个表达式,所以您需要引号:'cities' 或者如果同一个生产者发送给两者,则需要类似 headers['whereToSendHeader']

【讨论】:

注意,如果您在 yml 中执行此操作,请使用 3 个单引号,例如:routingKeyExpression: '''product''' 我无法理解这个答案。我们只有一个交换和绑定到它的各种队列。现在,简单地说,我该如何实现 RabbitTemplate.setRoutingKey(String routingKey)? 提出一个新问题,详细了解您的环境。【参考方案2】:

对于我们这些使用 yaml 的人:

spring:
  cloud:
    stream:
      rabbit:
        bindings:
          somechannel:
            producer:
              bindingRoutingKey: routingKey
              routing-key-expression: '"routingKey"'

Source

注意上面的 bindingRoutingKey - 如果您希望在使用 spring.cloud.stream.bindings.someChannel.producer.requiredGroups 时在生产者启动时绑定队列,则使用此键

【讨论】:

【参考方案3】:

好的,非常感谢。

添加

spring.cloud.stream.rabbit.bindings.producingChannel.producer.routingKeyExpression='persons'

使消息进入 streaming.persons 队列并

spring.cloud.stream.rabbit.bindings.producingChannel.producer.routingKeyExpression='cities'

在 streaming.cities 队列中。正是我想要的。

谢谢。看来我们毕竟要在项目中使用 Spring Cloud Stream..:-)

【讨论】:

【参考方案4】:

另一种(与 AMQP 无关的)方法是使用动态目标支持,即http://docs.spring.io/autorepo/docs/spring-cloud-stream-docs/Chelsea.SR2/reference/htmlsingle/#dynamicdestination

Rabbit 的主要区别在于您最终将拥有 2 个独立的交换(“城市”和“人员”) - 因此它不利用那里的路由支持,但它可以移植到其他消息传递系统比如卡夫卡。

【讨论】:

以上是关于如何为生产者设置路由键的主要内容,如果未能解决你的问题,请参考以下文章

NextJS:如何为生产构建添加屏幕加载?

如何为生产和开发环境 iOS 设置不同的证书和配置文件?

如何为 Kafka 生产者配置日志记录?

如何为activemq设置队列最大长度

RabbitMQ 运转流程

如何为开发和生产环境建立不同的配置文件