首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

RabbitMQ 通配符交換機實戰:Topic Exchange 模式詳解與代碼示例

     編輯:Java 綜合教學

路由鍵模式匹配:# 匹配多詞,* 匹配單詞,實現靈活的消息路由分發

繼 Direct Exchange(精確匹配)後,Topic Exchange 引入通配符機制,成為生產環境最常用的交換機類型。本文詳細解析通配符規則、綁定鍵設計、Java 客戶端代碼實現,並對比 Direct/Fanout/Topic 三大模式適用場景。

一、 通配符規則核心

  • 路由鍵:以 . 分隔的單詞序列,如 audit.irs.corporate。
  • # (井號):**匹配零個或多個單詞**。audit.# 匹配 audit、audit.irs、audit.irs.corporate。
  • * (星號):**匹配恰好一個單詞**。audit.* 只匹配 audit.irs,不匹配 audit 或 audit.irs.corporate。

Topic Exchange 架構圖 通配符匹配示例 官網示意圖

二、 代碼實現(Java Client)

1. 生產者:發送帶路由鍵消息

// 聲明 Topic 交換機
channel.exchangeDeclare("topic_logs", BuiltinExchangeType.TOPIC, true);

// 發送不同路由鍵消息
String[] routingKeys = {"quick.orange.rabbit", "lazy.orange.elephant", "quick.orange.fox"};
for (String key : routingKeys) {
    String msg = "Message with routing key: " + key;
    channel.basicPublish("topic_logs", key, null, msg.getBytes(StandardCharsets.UTF_8));
    System.out.println("Sent: " + key);
}

2. 消費者 1:綁定 *.orange.* (中間詞為 orange)

String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, "topic_logs", "*.orange.*");
DeliverCallback callback = (consumerTag, delivery) -> {
    String msg = new String(delivery.getBody(), StandardCharsets.UTF_8);
    System.out.println("Consumer1 received [" + delivery.getEnvelope().getRoutingKey() + "] " + msg);
};
channel.basicConsume(queueName, true, callback, consumerTag -> {});

3. 消費者 2:綁定 lazy.# (以 lazy 開頭)

String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, "topic_logs", "lazy.#");
// 同樣消費邏輯...

三、 運行效果驗證

  • quick.orange.rabbit → 同時進入 Consumer1 (*.orange.*) 和 Consumer2 (不匹配 lazy.#) → **僅 Consumer1 收到**。
  • lazy.orange.elephant → 匹配 *.orange.* 且匹配 lazy.# → **兩個消費者都收到**。
  • quick.orange.fox → 匹配 *.orange.* → **僅 Consumer1 收到**。
  • lazy.pink.rabbit → 匹配 lazy.# → **僅 Consumer2 收到**。

四、 三大交換機類型對比選型指南

類型匹配規則適用場景性能
DirectRoutingKey 精確等於 BindingKey單播、命令分發、固定業務路由最高 (O(1) 哈希查找)
Fanout無視 RoutingKey,廣播所有綁定隊列廣播通知、日志同步、事件通知高 (無匹配開銷)
Topic通配符模式匹配 (* / #)多維度路由、日志分級收集、微服務事件總線中 (Trie 樹匹配,較 Direct 慢)

五、 生產環境最佳實踐

  1. 路由鍵設計規範:採用 業務域.子系統.操作類型.實體 格式(如 order.payment.success.user),便於通配符訂閱。
  2. 避免濫用 #:# 過於寬泛易導致消息洪水,優先使用 * 精確匹配單層。
  3. 死信隊列配合:無隊列匹配時配置 alternate-exchange 導入死信隊列,防止消息靜默丟失。
  4. 監控告警:監控隊列堆積、消費延遲、未路由消息計數。

六、 總結

Topic Exchange 以通配符機制實現了多維度、鬆耦合的消息路由,是構建事件驅動架構、微服務異步通信的核心基礎設施。掌握 * 與 # 的語義邊界,設計清晰的路由鍵體系,是用好 RabbitMQ 的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved