RabbitMQ Binder 参考指南
本指南描述了 Spring Cloud Stream Binder 的 RabbitMQ 实现。它包含有关其设计、用法和配置选项的信息,以及 Stream Cloud Stream 概念如何映射到 RabbitMQ 特定构造的信息。
用法
要使用 RabbitMQ binder,您可以通过使用以下 Maven 坐标将其添加到 Spring Cloud Stream 应用程序中
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
或者,您可以使用 Spring Cloud Stream RabbitMQ Starter,如下所示
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
RabbitMQ Binder 概述
以下简化图显示了 RabbitMQ binder 的工作原理
默认情况下,RabbitMQ Binder 实现将每个目标映射到一个 TopicExchange
。对于每个消费者组,一个 Queue
绑定到该 TopicExchange
。每个消费者实例为其组的 Queue
都有一个相应的 RabbitMQ Consumer
实例。对于分区生产者和消费者,队列以分区索引为后缀,并使用分区索引作为路由键。对于匿名消费者(没有 group
属性的消费者),使用一个 auto-delete 队列(带有一个随机的唯一名称)。
通过使用可选的 autoBindDlq
选项,您可以配置 binder 来创建和配置死信队列 (DLQ)(以及一个死信交换机 DLX
,以及路由基础设施)。默认情况下,死信队列的名称是目标名称,并附加 .dlq
。如果启用了重试(maxAttempts > 1
),失败的消息在重试耗尽后会被发送到 DLQ。如果禁用了重试(maxAttempts = 1
),您应该将 requeueRejected
设置为 false
(默认值),以便失败的消息被路由到 DLQ,而不是被重新排队。此外,republishToDlq
会使 binder 将失败的消息发布到 DLQ(而不是拒绝它)。此功能允许在消息头中添加额外的信息(例如 x-exception-stacktrace
头中的堆栈跟踪)。有关截断堆栈跟踪的信息,请参见 frameMaxHeadroom
属性。此选项无需启用重试。您可以在仅尝试一次后重新发布失败的消息。从版本 1.2 开始,您可以配置重新发布消息的投递模式。请参见 republishDeliveryMode
属性。
如果 stream 监听器抛出 ImmediateAcknowledgeAmqpException
,则绕过 DLQ 并直接丢弃消息。从版本 2.1 开始,无论 republishToDlq
设置如何,这都适用;以前只有当 republishToDlq
为 false
时才如此。
将 requeueRejected 设置为 true (同时 republishToDlq=false )会导致消息被重新排队并持续重新投递,这可能不是您想要的,除非失败的原因是瞬态的。通常,您应该通过将 maxAttempts 设置为大于一或将 republishToDlq 设置为 true 来在 binder 中启用重试。 |
从版本 3.1.2 开始,如果消费者标记为 transacted
,则发布到 DLQ 将参与事务。这允许在发布因某些原因失败时回滚事务(例如,如果用户未被授权发布到死信交换机)。此外,如果连接工厂配置了发布者确认或返回,发布到 DLQ 将等待确认并检查是否有返回的消息。如果收到否定确认或返回消息,binder 将抛出 AmqpRejectAndDontRequeueException
,允许 broker 处理发布到 DLQ 的情况,就好像 republishToDlq
属性为 false
一样。
有关这些属性的更多信息,请参阅 RabbitMQ Binder 属性。
该框架没有提供任何标准机制来消费死信消息(或将其重新路由回主队列)。死信队列处理 中描述了一些选项。
当在 Spring Cloud Stream 应用程序中使用多个 RabbitMQ binder 时,禁用 'RabbitAutoConfiguration' 很重要,以避免将 RabbitAutoConfiguration 的相同配置应用于两个 binder。您可以使用 `@SpringBootApplication` 注解排除该类。 |
从版本 2.0 开始,RabbitMessageChannelBinder
将 RabbitTemplate.userPublisherConnection
属性设置为 true
,以便非事务性生产者避免消费者上的死锁,如果缓存连接由于 broker 上的内存告警而被阻塞,就可能发生死锁。
目前,`multiplex` 消费者(一个监听多个队列的消费者)仅支持消息驱动的消费者; polled 消费者只能从单个队列检索消息。 |
配置选项
本节包含特定于 RabbitMQ Binder 和绑定通道的设置。
有关常规绑定配置选项和属性,请参见 Spring Cloud Stream 核心文档。