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