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 | 隊列類型。如 stream 或 classic。 | QueueBuilder.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, headers。 | new 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