一般常用的類型有四種: fanout,direct,topic ,headers。 AMQP協議里還提到另外兩種類型:System和自定義,這里先不說這兩種,先說說常用的四種類型。
fanout:
fanout會把所有發送到該交換器的消息路由到所有與該交換器綁定的隊列中。
direct:
direct 類型的交換器路由規則也很簡單,會把消息路由到那些Bindingkey和Routingkey完全匹配的隊列中。
如圖所示,交換器類型為direct,如果我們發送一條消息,並在發送消息的時候設置路由鍵為 “warning”,則消息會路由到queue1和queue2 ,對應的代碼示例如下:
channel.basicPublish(exchange_name,”warning”,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());
如果在發送消息的時候設置路由為info 或者是 debug, 消息只會路由到queue2,如果以其他路由鍵發送消息,則消息不會路由到這兩個隊列中。
topic
前面講到direct 類型的交換器路由規則是與bindingkey和routingkey完全陪陪。但是這種嚴格得匹配方式在很多情況下不能滿足實際業務需求。topic類型的交換器在匹配規則上進行了擴展,他與direct類型的交換器相似,也是將消息路由到bindingkey和routingkey 相匹配的隊列中,但這里的匹配規則有些不同,約定:
- routingkey為一個點號“.”分隔字符串(被點號“.”分隔開的每一段獨立的符號串稱為一個單詞),如“com.rabbitmq.client”、“java.util.concurrent”、“com.hidden.client”
- bindingkey和routingkey 一樣是點號“.”分隔的字符串
- bindingkey中可以存在兩種特殊字符串“*”和“#”,用於做模糊匹配,其中“*”用於匹配一個單詞, “#”用於匹配多個單詞。如圖所示。
headers:
headers 類型的交換器不依賴與路由鍵的匹配規則來路由消息,而是根據發送消息的內容中的headers屬性進行匹配,在綁定隊列和交換器時指定一組鍵值對,當發送消息到交換器時,rabbitmq會獲取到消息的header(也是一個鍵值對的形式),對比其中的鍵值對是否完全匹配隊列和交換器綁定時指定的鍵值對,如果完全匹配則消息會路由到該隊列,否則不會路由到該隊列,headers類型的交換器性能會很差,且不實用,不推薦使用。