RabbitMQ Binder 参考指南

本指南介绍了 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 绑定器概述

以下简化图显示了 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 的设置如何,这都是如此;以前只有当 republishToDlqfalse 时才是这种情况。

requeueRejected 设置为 truerepublishToDlq=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 版开始,RabbitMessageChannelBinderRabbitTemplate.userPublisherConnection 属性设置为 true,以便非事务性生产者避免消费者上的死锁,如果缓存连接因代理上的 内存警报而被阻塞,则可能会发生这种情况。

目前,multiplex 消费者(单个消费者监听多个队列)仅支持消息驱动的消费者;轮询消费者只能从单个队列中检索消息。

配置选项

本节包含 RabbitMQ 绑定器和绑定通道的特定设置。

有关一般绑定配置选项和属性,请参阅 Spring Cloud Stream 核心文档