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