RabbitMQ Binder 參考指南

本指南描述了 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 屬性

如果 stream listener 拋出 ImmediateAcknowledgeAmqpException,則會繞過 DLQ,且訊息會直接丟棄。從 2.1 版開始,無論 republishToDlq 的設定為何,都是如此;先前僅在 republishToDlqfalse 時才是這種情況。

requeueRejected 設定為 true(且 republishToDlq=false)會導致訊息重新排隊並持續重新傳遞,除非失敗的原因是暫時性的,否則這可能不是您想要的。一般而言,您應該透過將 maxAttempts 設定為大於 1 或將 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 版開始,RabbitMessageChannelBinderRabbitTemplate.userPublisherConnection 屬性設定為 true,以便非交易式生產者避免在消費者上發生死鎖,如果快取連線因 broker 上的 記憶體警報 而被封鎖,則可能會發生死鎖。

目前,僅訊息驅動的消費者支援 multiplex 消費者(單一消費者監聽多個佇列);輪詢消費者只能從單一佇列檢索訊息。

組態選項

本節包含特定於 RabbitMQ Binder 和綁定通道的設定。

關於一般綁定組態選項和屬性,請參閱 Spring Cloud Stream 核心文件