Spring RabbitMQ

隊列配置參數 (Queue Configuration Parameters)

參數名稱描述Java 配置示例最佳實踐
durable隊列持久化。決定是否將隊列存入磁碟。持久化隊列在 RabbitMQ 重啟後依然存在。new Queue("myQueue", true)生產環境建議設為 true 以防意外重啟導致資料遺失。
exclusive排他性。標記為 true 的隊列僅對建立它的連接可見,且連接關閉後隊列會自動刪除。new Queue("myQueue", true, true, false)用於暫時性的、僅供單一客戶端使用的回應隊列。
autoDelete自動刪除。當最後一個消費者斷開連接後,伺服器是否自動刪除該隊列。new Queue("myQueue", true, false, true)暫時性隊列設為 true,長期隊列設為 false
ignoreDeclarationExceptions忽略宣告異常。設為 true 可避免因與現有隊列定義不同而導致的報錯。@RabbitListener(queuesToDeclare = @Queue(value = "q", ignoreDeclarationExceptions = "true"))需要與現有基礎設施靈活連接時使用。
x-queue-type隊列類型。如 streamclassicQueueBuilder.durable("q").withArgument("x-queue-type", "stream")大規模讀取需求使用 stream,一般情況使用 classic
x-dead-letter-exchange死信交換機 (DLX)。轉發被拒絕或過期的消息。QueueBuilder.durable("q").withArgument("x-dead-letter-exchange", "dlx")配合 x-dead-letter-routing-key 進行錯誤處理。
x-message-ttl消息存活時間 (TTL)。過期後消息會被刪除或轉發至 DLX。QueueBuilder.durable("q").withArgument("x-message-ttl", 60000)避免消息堆積。

交換機配置參數 (Exchange Configuration Parameters)

參數名稱描述Java 配置示例使用場景
durable交換機持久化。new DirectExchange("ex", true, false)生產環境通常設為 true
autoDelete自動刪除。當最後一個隊列解綁後自動刪除。new DirectExchange("ex", true, true)臨時交換機。
type類型:direct, fanout, topic, headersnew TopicExchange("myTopic")根據路由需求選擇。
delayed延遲交換機。需配合插件使用。ExchangeBuilder.directExchange("ex").delayed().build()預約通知、重試間隔控制。

RabbitListener 註解參數 (RabbitListener Annotation Parameters)

參數名稱描述Java 配置示例
queuesToDeclare宣告需要的隊列及其屬性。@RabbitListener(queuesToDeclare = @Queue("name"))
bindings同時宣告交換機、隊列與路由鍵的繫結。@RabbitListener(bindings = @QueueBinding(...))
ackMode確認模式:AUTO, MANUAL, NONE@RabbitListener(queues = "q", ackMode = "MANUAL")
concurrency並行消費者數量 (格式 min-max)。@RabbitListener(queues = "q", concurrency = "3-10")

消息保證等級 (Message Guarantee Levels)

等級描述配置重點使用場景
至多一次 (At most once)消息可能遺失,但絕不重複。ackMode=NONE速度優先,容許遺失。
至少一次 (At least once)消息絕不遺失,但可能重複。ackMode=AUTO + 持久化標準業務需求。
精確一次 (Exactly once)消息不遺失且不重複。冪等性處理 + 事務 + 持久化金融支付。

實作類別與介面 (Implementation)

  • RabbitTemplate: 中心類別,用於發送與接收消息。
  • AmqpAdmin: 用於管理隊列、交換機與繫結。
  • MessageConverter: 處理 Java 物件與消息格式(如 JSON)的轉換。

拓樸架構圖 (Diagrams)

一對多 (One to Many): 廣播或多路由

  flowchart LR
    EX[Exchange]
    B1((Binding<br/>rk1))
    B2((Binding<br/>rk2))
    Q1[Queue1]
    Q2[Queue2]

    EX --> B1 --> Q1
    EX --> B2 --> Q2

多對一 (Many to One): 聚合消息

  flowchart LR
    EX1[Exchange1]
    EX2[Exchange2]
    B1((Binding))
    B2((Binding))
    Q1[Queue1]

    EX1 --> B1 --> Q1
    EX2 --> B2 --> Q1