RabbitMQ之交换机的四种类型和属性
交換機主要包括如下4種類型:
Direct exchange(直連交換機)
Fanout exchange(扇型交換機)
Topic exchange(主題交換機)
Headers exchange(頭交換機)
另外RabbitMQ默認定義一些交換機:
默認交換機
amq.* exchanges
還有一類特殊的交換機:Dead Letter Exchange(死信交換機)
Direct exchange(直連交換機)
直連型交換機(direct exchange)是根據消息攜帶的路由鍵(routing key)將消息投遞給對應隊列的,步驟如下:
將一個隊列綁定到某個交換機上,同時賦予該綁定一個綁定鍵(bingding key)
當一個攜帶著路由值為R的消息被發送給直連交換機時,交換機會把它路由給綁定值同樣為R的隊列。
Fanout exchange(扇型交換機)
扇型交換機(funout exchange)將消息路由給綁定到它身上的所有隊列。不同于直連交換機,路由鍵在此類型上不啟任務作用。如果N個隊列綁定到某個扇型交換機上,當有消息發送給此扇型交換機時,交換機會將消息的發送給這所有的N個隊列
Topic exchange(主題交換機)
主題交換機(topic exchanges)中,隊列通過綁定鍵綁定到交換機上,然后,交換機根據消息里的路由值,將消息路由給一個或多個綁定隊列。
扇型交換機和主題交換機異同:
對于扇型交換機路由鍵是沒有意義的,只要有消息,它都發送到它綁定的所有隊列上
對于主題交換機,路由規則由BindingKey決定,只有路由值滿足BindingKey的規則,消息才可以路由到對應的隊列上
匹配規則
RoutingKey 為一個 點號’.’: 分隔的字符串。比如: java.xiaoka.show
BindingKey和RoutingKey一樣也是點號“.“分隔的字符串。
BindingKey可使用 * 和 # 用于做模糊匹配,*匹配一個單詞,#匹配多個或者0個
Headers exchange(頭交換機)
類似主題交換機,但是頭交換機使用多個消息屬性來代替路由鍵建立路由規則。通過判斷消息頭的值能否與指定的綁定相匹配來確立路由規則。
此交換機有個重要參數:”x-match”
當”x-match”為“any”時,消息頭的任意一個值被匹配就可以滿足條件
當”x-match”設置為“all”的時候,就需要消息頭的所有值都匹配成功
RabbitMQ默認定義一些交換機
在RabbitMQ默認定義一些交換機,主要如下:
默認交換機
默認交換機(default exchange)實際上是一個由RabbitMQ預先聲明好的名字為空字符串的直連交換機(direct exchange)。它有一個特殊的屬性使得它對于簡單應用特別有用處:那就是每個新建隊列(queue)都會自動綁定到默認交換機上,綁定的路由鍵(routing key)名稱與隊列名稱相同。
如:當你聲明了一個名為”hello”的隊列,RabbitMQ會自動將其綁定到默認交換機上,綁定(binding)的路由鍵名稱也是為”hello”。因此,當攜帶著名為”hello”的路由鍵的消息被發送到默認交換機的時候,此消息會被默認交換機路由至名為”hello”的隊列中。即默認交換機看起來貌似能夠直接將消息投遞給隊列,如同我們之前文章里看到一例子。
類似amq.*的名稱的交換機
這些是RabbitMQ默認創建的交換機。這些隊列名稱被預留做RabbitMQ內部使用,不能被應用使用,否則拋出403 (ACCESS_REFUSED)錯誤
Dead Letter Exchange(死信交換機)
在默認情況,如果消息在投遞到交換機時,交換機發現此消息沒有匹配的隊列,則這個消息將被悄悄丟棄。為了解決這個問題,RabbitMQ中有一種交換機叫死信交換機。當消費者不能處理接收到的消息時,將這個消息重新發布到另外一個隊列中,等待重試或者人工干預。這個過程中的exchange和queue就是所謂的”Dead Letter Exchange 和 Queue”
交換機的屬性
除交換機類型外,在聲明交換機時還可以附帶許多其他的屬性,其中最重要的幾個分別是:
Name:交換機名稱
Durability:是否持久化。如果持久性,則RabbitMQ重啟后,交換機還存在
Auto-delete:當所有與之綁定的消息隊列都完成了對此交換機的使用后,刪掉它
Arguments:擴展參數
總結
以上是生活随笔為你收集整理的RabbitMQ之交换机的四种类型和属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么要用MQ
- 下一篇: 生产者发送消息的过程?