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