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