習(xí)筆記-交換機(jī)類型和路由規(guī)則)
交換機(jī)是RabbitMQ路由消息的核心不同類型的交換機(jī)對應(yīng)不同的路由邏輯交換機(jī)和路由規(guī)則是多對多綁定適配不同的業(yè)務(wù)場景。RabbitMQ提供4種默認(rèn)交換機(jī)類型其中前3種最常用。1、Direct Exchange直連交換機(jī)精準(zhǔn)匹配一對一/多路由Direct交換機(jī)是最基礎(chǔ)的類型核心邏輯是“路由鍵Routing Key與綁定鍵Binding Key完全匹配”僅當(dāng)兩者字符完全一致時消息才會被路由到對應(yīng)隊列。核心特性路由規(guī)則簡單直接精準(zhǔn)度高。一個隊列可綁定多個Binding Key一個Binding Key也可綁定多個隊列此時消息會被路由到所有匹配隊列類似“多播”。適用場景需要精準(zhǔn)路由的場景例如業(yè)務(wù)模塊拆分“訂單支付”消息僅路由到“支付處理隊列”“訂單退款”消息僅路由到“退款處理隊列”。任務(wù)分發(fā)特定類型的任務(wù)分配給指定的工作隊列如視頻轉(zhuǎn)碼任務(wù)分配給轉(zhuǎn)碼 worker 隊列。工作流程示例1. 聲明Direct交換機(jī)名稱direct_exchange2. 隊列A綁定Binding Key order.pay隊列B綁定Binding Key order.refund隊列C綁定Binding Key order.pay3. 生產(chǎn)者發(fā)送消息指定Routing Key order.pay4. 交換機(jī)匹配后將消息路由到隊列A和隊列C隊列B無消息。交換機(jī)綁定隊列的代碼如下// 聲明一個直連交換機(jī)channel.exchangeDeclare(direct_exchange, direct, true);// 聲明一個隊列channel.queueDeclare(order_queue, true, false, false, null);// 將隊列綁定到交換機(jī)綁定鍵為 order.createchannel.queueBind(order_queue, direct_exchange, order.create);2、Fanout Exchange扇出交換機(jī)無差別廣播一對多路由Fanout交換機(jī)是“廣播型”交換機(jī)核心邏輯是“忽略Routing Key將消息路由到所有與該交換機(jī)綁定的隊列”無需匹配規(guī)則只要隊列綁定了交換機(jī)就能收到消息。核心特性路由邏輯最簡單效率最高無需匹配計算。消息會被復(fù)制到所有綁定隊列每個隊列都能收到完整消息。適用場景需要廣播消息的場景例如系統(tǒng)通知服務(wù)啟動/下線通知、全局配置更新所有相關(guān)服務(wù)都需接收。日志收集應(yīng)用日志同時發(fā)送到“實(shí)時分析隊列”和“歸檔存儲隊列”。事件同步用戶注冊成功后同步觸發(fā)“發(fā)送歡迎短信”“創(chuàng)建用戶檔案”“添加積分”等多個任務(wù)。工作流程示例1. 聲明Fanout交換機(jī)名稱fanout_exchange2. 隊列1、隊列2綁定該交換機(jī)隊列3未綁定3. 生產(chǎn)者發(fā)送消息即使指定Routing Key也會被忽略4. 交換機(jī)將消息路由到隊列1和隊列2隊列3無消息。3、Topic Exchange主題交換機(jī)模糊匹配按“主題”路由Topic交換機(jī)是最靈活的類型核心邏輯是“通過通配符匹配Routing Key與Binding Key”支持按“主題”批量路由消息兼顧精準(zhǔn)性和靈活性。核心特性Routing Key和Binding Key需為“多段字符串”段之間用“.”分隔如“user.create.wechat”每段代表一個業(yè)務(wù)維度如業(yè)務(wù)類型、操作、渠道。支持兩種通配符*星號匹配1個任意段如“user.*”可匹配“user.create”“user.delete”但不匹配“user.create.wechat”#井號匹配0個或多個任意段如“user.#”可匹配“user”“user.create”“user.create.wechat”。適用場景需要按“主題”分類路由的場景例如多維度業(yè)務(wù)消息通過“user.#”接收所有用戶相關(guān)消息通過“user.create.*”僅接收用戶創(chuàng)建的細(xì)分消息??缒K消息分發(fā)訂單消息按地區(qū)拆分Binding Key order.#.beijing僅接收北京地區(qū)的訂單消息。工作流程示例1. 聲明Topic交換機(jī)名稱topic_exchange2. 隊列A綁定Binding Key user.create.*隊列B綁定Binding Key user.#隊列C綁定Binding Key user.*.alipay3. 生產(chǎn)者發(fā)送消息指定Routing Key user.create.wechat4. 交換機(jī)匹配后將消息路由到隊列A*匹配“wechat”和隊列B#匹配“create.wechat”隊列C不匹配無消息。4、Headers Exchange頭部交換機(jī)按消息頭匹配忽略Routing KeyHeaders交換機(jī)通過消息的頭部屬性而非Routing Key進(jìn)行匹配靈活性較高但路由邏輯復(fù)雜性能略差實(shí)際應(yīng)用中較少使用。核心邏輯是生產(chǎn)者發(fā)送消息時設(shè)置消息頭如“typeorder”“priorityhigh”交換機(jī)根據(jù)綁定隊列時指定的頭部規(guī)則如“匹配所有頭”“匹配任意頭”路由消息。適用場景需根據(jù)多維度屬性路由消息且不希望依賴Routing Key的特殊場景如復(fù)雜的權(quán)限控制消息。