RabbitMQ 的工作隊列模式(Work Queues)和路由模式(Routing)是兩種不同的消息傳遞模式,主要區別在于消息的分發邏輯和使用場景。以下是它們的核心差異:
1. 工作隊列模式(Work Queues)
特點
- 單隊列多消費者:多個消費者監聽同一個隊列,消息按順序分發給不同的消費者(輪詢或公平分發)。
- 負載均衡:適用于處理耗時任務,將任務分發給多個工作者并行處理。
- 無路由鍵:生產者只需要將消息發送到隊列,無需指定額外的路由信息。
示例場景
- 訂單處理:多個訂單處理服務共同消費訂單隊列。
- 圖片處理:多個 Worker 并行處理圖片任務。
核心代碼
// 生產者:發送消息到隊列
channel.BasicPublish(exchange: "", routingKey: "task_queue", body: message);// 消費者:監聽同一個隊列
channel.BasicConsume(queue: "task_queue", consumer: consumer);
2. 路由模式(Routing)
特點
- 交換器 + 路由鍵:生產者將消息發送到交換器(Exchange),并指定路由鍵(routing key)。
- 多隊列綁定:消費者創建隊列并綁定到交換器,同時指定需要接收的路由鍵。
- 選擇性消費:根據路由鍵將消息路由到不同的隊列,一個消息可以被多個匹配的隊列接收。
示例場景
- 日志系統:根據日志級別(
info
/error
/warning
)將日志路由到不同的隊列。 - 業務分類:根據訂單類型(
normal
/vip
/urgent
)分發到不同的處理流程。
核心代碼
// 生產者:發送消息到交換器,指定路由鍵
channel.BasicPublish(exchange: "direct_logs", routingKey: "error", body: message);// 消費者:創建隊列并綁定到交換器,指定路由鍵
channel.QueueBind(queue: queueName, exchange: "direct_logs", routingKey: "error");
3. 核心區別對比
維度 | 工作隊列模式 | 路由模式 |
---|---|---|
消息分發邏輯 | 輪詢或公平分發到多個消費者 | 根據路由鍵選擇性分發到匹配的隊列 |
交換器類型 | 默認交換器("" )或扇出交換器(fanout ) | 直連交換器(direct )或主題交換器(topic ) |
路由鍵 | 不需要 | 必須指定,用于消息路由 |
隊列數量 | 單個隊列 | 多個隊列,每個隊列綁定不同的路由鍵 |
消息流向 | 1 個生產者 → 1 個隊列 → N 個消費者中的 1 個 | 1 個生產者 → 交換器 → N 個匹配的隊列 → 對應消費者 |
典型場景 | 任務分發、負載均衡 | 選擇性消息處理、日志分類 |
4. 如何選擇?
- 選工作隊列:當你需要將同類型任務分發給多個工作者并行處理,例如批量計算、數據導入。
- 選路由模式:當你需要根據業務邏輯將消息路由到不同的處理流程,例如訂單分類、日志分級存儲。
實際應用中,還可以結合使用多種模式,構建更復雜的消息系統。