消息隊列Rabbitmq的交換器類型

一、交換器類型

在rabbitmq中,生產者的消息都是通過交換器來接收,然後再從交換器分發到不同的隊列中去,在分發的過程中交換器類型會影響分發的邏輯。

rabitmq中的交換器有4種類型,分別爲fanout、direct、topic、headers四種,其中前三種較爲常見,後面一種用的比較少。

二、fanout

一般情況下交換器分發會先找出綁定的隊列,然後再判斷routekey,來決定是否將消息分發到某一個隊列中;但如果交換器的類型爲fanout,那麼交換器就不再判斷routekey了,而是將消息直接分發到綁定的隊列中去,如下測試代碼

Channel channel = connection.createChannel();    //在rabbitmq中創建一個信道
channel.exchangeDeclare("exchangeName", "fanout"); //創建一個type爲fanout的交換器    
channel.queueDeclare("queueName");    //創建一個隊列
channel.queueBind("queueName", "exchangeName", "routingKey");   //將隊列和交換器綁定

三、direct

在類型爲direct的情況下,交換器在分發消息的時候同樣會先獲取綁定的隊列,然後還會再判斷routeing;當交換器發現類型爲direct判斷routeing的規則是完全匹配模式,只有消息完全等於到routeing的時候,纔會將消息分發到指定隊列;

一個隊列是可以指定多個路由鍵的,我們假設有兩個隊列,分別是隊列一隊列二;在隊列一中指定了三個路由鍵,分別是zhangsanlisi,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匹配的時候匹配都匹配成功,因此兩個隊列都收到了消息;

四、topic

在類型爲topic的情況下,交換器分發消息的時候也需要同時匹配bindKeyroutingKey;但與direct類型不同的是當交換器發現類型爲topic時候,判斷routeing的規則是模糊匹配模式。

rabitmq自定義了一套匹配規則,在這裏我假設生產者發送了一個消息,其中的的routingKey爲wiki.imooc.com,那麼交換器爲topic類型時候,想要獲取到這條消息,可以用*號作爲通配符,來指定routingKey,分別是*.*.com*.imooc.**wiki.imooc.*;同樣也可以使用#作爲通配符來指定路由鍵,例如wiki.##.com

在上面的通配符列子中,我們需要掌握這幾點:

  • 路由鍵以.爲分隔符,每一個分隔符的代表一個單詞
  • 通配符*匹配一個單詞、通配符#可以匹配多個單詞
  • *可以在routingKey和bindKey上使用,#只能用於RoutingKey中

五、headers

類型爲headers的交換器與前面三種匹配方式完全不一樣,它不依賴與bindingKey和routingKey,而是在綁定隊列與交換器的時候指定一個鍵值對;當交換器在分發消息的時候會先解開消息體裏的headers數據,然後判斷裏面是否有所設置的鍵值對,如果發現匹配成功,纔將消息分發到隊列中;這種交換器類型在性能上相對來說較差,在實際工作中很少會用到。

六、小結

  1. 從消息分發的性能上來比較:fanout > direct > topic > headers
  2. topic的匹配規則只是用於消費者而不是生產者

作者:湯青松

日期:2020-05-09

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章