在rabbitmq中,生產者的消息都是經過交換器
來接收,而後再從交換器
分發到不一樣的隊列中去,在分發的過程當中交換器類型
會影響分發的邏輯。性能
rabitmq中的交換器
有4種類型,分別爲fanout、direct、topic、headers四種,其中前三種較爲常見,後面一種用的比較少。測試
通常狀況下交換器分發會先找出綁定的隊列,而後再判斷routekey
,來決定是否將消息分發到某一個隊列中;但若是交換器的類型爲fanout
,那麼交換器就再也不判斷routekey
了,而是將消息直接分發到綁定的隊列中去,以下測試代碼code
Channel channel = connection.createChannel(); //在rabbitmq中建立一個信道 channel.exchangeDeclare("exchangeName", "fanout"); //建立一個type爲fanout的交換器 channel.queueDeclare("queueName"); //建立一個隊列 channel.queueBind("queueName", "exchangeName", "routingKey"); //將隊列和交換器綁定
在類型爲direct
的狀況下,交換器在分發消息的時候一樣會先獲取綁定的隊列,而後還會再判斷routeing
;當交換器發現類型爲direct
判斷routeing的規則是徹底匹配模式,只有消息徹底等於到routeing的時候,纔會將消息分發到指定隊列;rabbitmq
一個隊列是能夠指定多個路由鍵的,咱們假設有兩個隊列,分別是隊列一
、隊列二
;在隊列一
中指定了三個路由鍵,分別是zhangsan
、lisi
,wangwu
,在隊列二
中指定了一個隊列鍵lisi
,指定多個路由鍵的代碼以下所示:隊列
Channel channel = connection.createChannel(); //在rabbitmq中建立一個信道 channel.exchangeDeclare("exchangeName", "direct"); //建立一個type爲direct的交換器 channel.queueDeclare("queueName"); //建立一個隊列 channel.queueBind("queueName", "exchangeName", "zhangsna"); //綁定並設置路由鍵 channel.queueBind("queueName", "exchangeName", "lisi"); //綁定並設置路由鍵 channel.queueBind("queueName", "exchangeName", "wangwu"); //綁定並設置路由鍵
當生產者發送了一條routeting爲zhangsan
的消息到交換器中,交換器在分發的時候只會把消息分發到隊列一
裏面去,由於交換器在routeting匹配的時候只匹配到了隊列一
,所以隊列二
不會收到消息;路由
當生產者再次發送了一條routeting爲lisi
的消息到交換器中,交換器在分發的時候會把消息分發到隊列一
和隊列二
兩個隊列裏面去,由於交換器在routeting匹配的時候匹配都匹配成功,所以兩個隊列都收到了消息;it
在類型爲topic
的狀況下,交換器分發消息的時候也須要同時匹配bindKey
和routingKey
;但與direct
類型不一樣的是當交換器發現類型爲topic
時候,判斷routeing的規則是模糊匹配模式。io
rabitmq自定義了一套匹配規則,在這裏我假設生產者發送了一個消息,其中的的routingKey爲wiki.imooc.com
,那麼交換器爲topic
類型時候,想要獲取到這條消息,能夠用*
號做爲通配符,來指定routingKey,分別是*.*.com
、*.imooc.*
、*wiki.imooc.*
;一樣也可使用#
做爲通配符來指定路由鍵,例如wiki.#
、#.com
;route
在上面的通配符列子中,咱們須要掌握這幾點:channel
.
爲分隔符,每個分隔符的表明一個單詞*
匹配一個單詞、通配符#
能夠匹配多個單詞*
能夠在routingKey和bindKey上使用,#
只能用於RoutingKey中類型爲headers
的交換器與前面三種匹配方式徹底不同,它不依賴與bindingKey和routingKey,而是在綁定隊列與交換器的時候指定一個鍵值對;當交換器在分發消息的時候會先解開消息體裏的headers
數據,而後判斷裏面是否有所設置的鍵值對,若是發現匹配成功,纔將消息分發到隊列中;這種交換器類型在性能上相對來講較差,在實際工做中不多會用到。
fanout
> direct
> topic
> headers
做者:湯青松
日期:2020-05-09