RabbitMQ 是 AMQP(Advanced Message Queuing Protocol)的開源實作,使用 Erlang 編寫,支援多種語言客戶端。作為訊息中介軟體,它實現元件解耦:生產者無需知曉消費者存在,反之亦然。核心特性包含訊息導向、佇列、路由(點對點與發布/訂閱)、可靠性與安全性。
訊息儲存的內部物件。生產者(P)投遞訊息到 Queue,消費者(C)從中取出處理。多個消費者訂閱同一 Queue 時,訊息會平均分攤(輪詢分發),而非廣播。
防止消費者處理訊息途中宕機導致訊息遺失。消費者處理完畢需發送 ACK,RabbitMQ 收到 ACK 才移除訊息。若連線斷開未收到 ACK,訊息會重新分發給其他消費者。注意:無 timeout 機制,僅靠連線斷開觸發重發。開發者忘記發送 ACK 會導致佇列堆積與重複消費。
將 Queue 與 Message 設為 durable,可在 RabbitMQ 重啟後保留訊息。但極端情況(如收到訊息尚未持久化即斷電)仍可能遺失,需配合事務機制解決。
限制每次分發給消費者的訊息數。設 prefetchCount=1 可實現公平分發,避免處理時間不均導致部分消費者閒置。
生產者不直接發送訊息到 Queue,而是發送到 Exchange,由 Exchange 根據路由規則轉發到一或多個 Queue(或丟棄)。
生產者發送訊息時指定的路由鍵,配合 Exchange Type 與 Binding Key 決定訊息流向。長度限制 255 bytes。
將 Exchange 與 Queue 關聯,指定 Binding Key。當 Binding Key 與 Routing Key 匹配時,訊息路由到對應 Queue。
| 類型 | 路由規則 |
|---|---|
| fanout | 廣播模式:訊息路由到所有綁定的 Queue,忽略 Binding Key |
| direct | 精確匹配:Routing Key 完全等於 Binding Key 的 Queue 接收訊息 |
| topic | 模糊匹配:Routing Key 為「.」分隔字串,Binding Key 支援 *(匹配單詞)與 #(匹配多詞) |
| headers | 依訊息 headers 屬性匹配,不依賴 Routing Key |
RabbitMQ 本質是非同步,但可透過 replyTo(回應佇列)與 correlationId(請求識別碼)實現同步 RPC:客戶端發送請求並監聽回應佇列,服務端處理後將結果發送至 replyTo 指定佇列並帶上 correlationId,客戶端據此匹配請求與回應。
掌握 Queue、Exchange、Binding、Routing Key 等核心概念,並善用持久化、確認機制、Prefetch Count 等進階特性,即可應對絕大多數非同步業務場景。