RabbitMq(三)交換機類型


Exchange Types

direct(交換機的直連接類型

  direct類型會把消息路由到那些binding key與routing key完全匹配的Queue中。(在實際使用RabbitMQ的過程中並沒有binding key這個參數,只有routing key,為了區分我們把交換機和隊列綁定時傳的參數叫binding key,把發送消息時帶的這個參數叫routing key)
  交換機的類型用於交換機如何將消息路由到哪些隊列中去,在綁定隊列時channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY)會將隊列名、交換機名稱、路由鍵作為一條記錄插入到數據庫中,當發布消息時channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes(“UTF-8”))會指定交換機名稱和路由鍵,如果將交換機名+路由鍵 作為聯合主鍵,根據這個聯合組件就能查到隊列名(EXCHANGE_NAME + ROUTING_KEY)—》QUEUE_NAME, 從而將消息發送到指定的隊列,直連接的規則就是綁定的路由鍵和發布消息的路由鍵必須完全相等才能路由到關聯的隊列上,用java代碼表示 routingKeyForPublishMessage.equals(routingKeyForQueueBind),直連接就是完全相等,像其他類型可以類似於正則表達式或是數據庫中的like的模糊匹配,只要模糊匹配成功就可以將消息路由到指定的隊列中。
  適用場景:有優先級的任務,根據任務的優先級把消息發送到對應的隊列,這樣可以指派更多的資源去處理高優先級的隊列。

fanout(扇形交換機)

  fanout是交換機的廣播類型,不需要routingKey,交換機會將所有的消息都發送到每個綁定的隊列中去。生產者發送到Exchange的所有消息都會路由到綁定的Queue,並最終被多個消費者消費。fanout廣播類型在發布消息時可以只先指定交換機的名稱,交換機的聲明的代碼可以放到消費者端進行聲明,隊列的聲明也放在消費者端來聲明。

  發布訂閱類似觀察者模式設計模式,一般適用於當接收到某條消息時同時做多種類似的任務的處理,如一個發短信,另一個發郵件,一個插入數據庫,另一個保存在文件等類似操作,扇形交換機將消息傳送給不同的隊列,不同的隊列對同一種消息采取不同的行為。

  扇形交換機是最基本的交換機類型,它所能做的事情非常簡單———廣播消息。扇形交換機會把能接收到的消息全部發送給綁定在自己身上的隊列。因為廣播不需要“思考”,所以扇形交換機處理消息的速度也是所有的交換機類型里面最快的。

topic(主題交換機

主題類型topic,直連接類型direct必須是生產者發布消息指定的routingKey和消費者在隊列綁定時指定的routingKey完全相等時才能匹配到隊列上,與direct不同, topic可以進行模糊匹配,可以使用*和#這兩個通配符來進行模糊匹配,其中*可以代替一個單詞;主題類型的轉發器的消息不能隨意的設置選擇鍵(routing_key),必須是由點隔開的一系列的標識符組成,如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”。標識符可以是任何東西,但是一般都與消息的某些特性相關,你可以定義任何數量的標識符,上限為255個字節。 #可以替代零個或更多的單詞,只要能模糊匹配上就能將消息映射到隊列中。當一個隊列的綁定鍵為#的時候,這個隊列將會無視消息的路由鍵,接收所有的消息。

headers(首部交換機)

首部交換機和扇形交換機都不需要路由鍵routingKey,交換機時通過Headers頭部來將消息映射到隊列的,有點像HTTP的Headers,Hash結構中要求攜帶一個鍵“x-match”,這個鍵的Value可以是any或者all,這代表消息攜帶的Hash是需要全部匹配(all),還是僅匹配一個鍵(any)就可以了。相比直連交換機,首部交換機的優勢是匹配的規則不被限定為字符串(string)而是Object類型。
any: 只要在發布消息時攜帶的有一對鍵值對headers滿足隊列定義的多個參數arguments的其中一個就能匹配上,注意這里是鍵值對的完全匹配,只匹配到鍵了,值卻不一樣是不行的;
all:在發布消息時攜帶的所有Entry必須和綁定在隊列上的所有Entry完全匹配

首部交換機比直連交換機的優勢:
直連接適用於計較簡單的路由,而首部類型相比直連接匹配規則更強大。
a)綁定規則靈活:直連接是一個簡單的String;而首部是鍵值對Entry,而且鍵值對的value可以是任意類型Object
b)綁定個數靈活:直連接一次只能綁定一個字符串,如果想綁定多個字符串就需要綁定多次或者循環調用queueBind()方法來綁定多次;而首部類型直接可以往Map中添加多個實體Entry即可
c)映射規則靈活:直連接只需要比較路由鍵是否相等即可,而首部類型除了比較value還要比較key,因為首部類型是Entry類型,需要同時比較key和value,而且首部類型還可以通過x-match來控制匹配的條件,all:需要匹配所有Entry,相當於SQL中的and操作,any:只需要匹配上一個Entry即可,相當於SQL中的or操作

 摘自:https://blog.csdn.net/vbirdbest/article/category/7296570


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM