返回文章列表
rabbitmq
什麼是 RabbitMQ
介紹 Message Queue 的概念,以及 RabbitMQ 的核心組成元件:Producer、Broker(Exchange、Binding、Queue)、Consumer 與 ACK 機制
Aaron
什麼是 Message Queue
- Message: 在不同 service / app / module 之間傳遞的資料
- Queue: FIFO 先進先出的 Data Structure
可以將 Message 以 Queue 的形式儲存起來,並且可以在不同 Service 之間傳遞,達到將同步的事件驅動變成異步的消息驅動。
作用
- 解耦: Producer 和 Consumer 只與 Message Queue 互動,不需要直接互相溝通。 Producer 不需要考慮有多少 Consumer 會消費這筆 Message,以不需要知道 Consumer 是以什麼語言開發。
- 異步: Producer 不用等 Consumer 處理完 Message 才執行下一步動作。 Message 會在 Message Queue 裡面暫存下來,等 Consumer 啟動後自行去 Message Queue 上處理。
組成

Producer
負責產生發訊息。 Producer 不直接將訊息發送到 Queue,而是發給 Exchange。
Connection
- Producer 與 Broker 之間建立的 TCP connection
- 建立成本高,通常會重複使用(connection pool)
Channel
- 在 Connection 內部建立的輕量虛擬通道
- 一個 Connection 可以建立多個 Channel,避免頻繁建立 TCP connection
- 每個 Thread 建議使用獨立的 Channel ( Channel 不是 Thread Safe )
Broker
Exchange
- Message 的 Route Center,接收來自 Producer 的訊息,並根據規則決定送往哪些 Queue
- 不負責儲存訊息,只負責轉發
| 類型 | Route |
|---|---|
| Direct | route key 完全相符才轉發 |
| Fanout | 轉發給所有綁定的 Queue |
| Topic | 使用萬用字元匹配 (* 單詞,# 多詞) |
| Headers | 依照訊息 Header 屬性匹配 |
Binding
- Exchange 與 Queue 之間的路由規則設定
- 包含一個 Binding Key,Exchange 會拿 routing key 與它比對
- 一個 Queue 可以綁定到多個 Exchange;一個 Exchange 也可以綁定多個 Queue
Queue
- 訊息的儲存容器,等待 Consumer 來取用
- 重要屬性:
- Durable:重啟後是否保留(需搭配訊息設 persistent)
- Exclusive:僅限單一 Connection 使用,連線斷開自動刪除
- Auto-delete:最後一個 Consumer 取消訂閱後自動刪除
- TTL:訊息在 Queue 中的最長存活時間
- Dead Letter Queue (DLQ) :訊息被拒絕(reject/nack)或 TTL 到期,可設定自動轉入 DLQ,避免訊息無聲消失
Consumer
訂閱 Queue 並處理訊息的應用程式。
ACK 機制
- Auto ACK:訊息送出即視為完成,效能高但可能丟訊息
- Manual ACK:Consumer 處理完後手動發送
basic.ack,Broker 才移除訊息 - Nack / Reject:處理失敗時拒絕訊息,可選擇 requeue 或轉入 DLQ
Prefetch / QoS
- 控制 Consumer 一次最多接收幾條未 ACK 的訊息
- 設定
prefetch_count = 1可實現公平分發,避免某個慢 Consumer 堆積大量訊息