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 核心文件。