rabbitmq Exchange 交換機概念說明
阿新 • • 發佈:2019-02-01
廣播式交換器型別(fanout)
該類交換器不分析所接收到訊息中的Routing Key,預設將訊息轉發到所有與該交換器繫結的佇列中去。廣播式交換器轉發效率最高,但是安全性較低,消費者應用程式可獲取本不屬於自己的訊息。
廣播交換器是最簡單的一種型別,就像我們從字面上理解到的一樣,它把所有接受到的訊息廣播到所有它所知道的佇列中去,不論訊息的關鍵字是什麼,訊息都會被路由到和該交換器繫結的佇列中去。
它的工作方式如下圖所示:
在程式中申明一個廣播式交換器的程式碼如下: channel.exchange_declare(exchange='fanout',type='fanout')
直接式交換器型別(direct)
該類交換器需要精確匹配Routing Key與BindingKey,如訊息的Routing Key = Cloud,那麼該條訊息只能被轉發至Binding Key = Cloud的訊息佇列中去。直接式交換器的轉發效率較高,安全性較好,但是缺乏靈活性,系統配置量較大。
相對廣播交換器來說,直接交換器可以給我們帶來更多的靈活性。直接交換器的路由演算法很簡單——一個訊息的routing_key完全匹配一個佇列的 binding_key,就將這個訊息路由到該佇列。繫結的關鍵字將佇列和交換器繫結到一起。當訊息的routing_key和多個繫結關鍵字匹配時訊息
可能會被髮送到多個佇列中。
我們通過下圖來說明直接交換器的工作方式:
如圖:Q1,Q2兩個佇列繫結到了直接交換器X上,Q1的binding_key是“orange”,Q2有兩個繫結,一個binding_key是black,另一個binding_key是green。在這樣的關係下,一個帶有 “orange” routing_key的訊息傳送到X交換器之後將會被X路由到佇列Q1,一個帶有 “black” 或者 “green” routing_key的訊息傳送到X交換器之後將會被路由到Q2。而所有其他訊息將會被丟失掉。 主題式交換器(Topic Exchange) 該類交換器通過訊息的Routing Key與Binding Key的模式匹配,將訊息轉發至所有符合繫結規則的佇列中。Binding Key支援萬用字元,其中“*”匹配一個片語,“#”匹配多個片語(包括零個)。例如,Binding Key=“*.Cloud.#”可轉發Routing Key=“OpenStack.Cloud.GD.GZ”、“OpenStack.Cloud.Beijing”以及“OpenStack.Cloud”的訊息,但是對於Routing Key=“Cloud.GZ”的訊息是無法匹配的。
這裡的routing_key可以使用一種類似正則表示式的形式,但是特殊字元只能是“*”和“#”,“*”代表一個單詞,“#”代表0個或是多個單詞。這樣傳送過來的訊息如果符合某個queue的routing_key定義的規則,那麼就會轉發給這個queue。 緊接著說一下交換機.交換機的主要作用是接收相應的訊息並且繫結到指定的佇列.交換機有四種類型,分別為Direct,topic,headers,Fanout. Direct是RabbitMQ預設的交換機模式,也是最簡單的模式.即建立訊息佇列的時候,指定一個BindingKey.當傳送者傳送訊息的時候,指定對應的Key.當Key和訊息佇列的BindingKey一致的時候,訊息將會被髮送到該訊息佇列中. topic轉發資訊主要是依據萬用字元,佇列和交換機的繫結主要是依據一種模式(萬用字元+字串),而當傳送訊息的時候,只有指定的Key和該模式相匹配的時候,訊息才會被髮送到該訊息佇列中. headers也是根據一個規則進行匹配,在訊息佇列和交換機繫結的時候會指定一組鍵值對規則,而傳送訊息的時候也會指定一組鍵值對規則,當兩組鍵值對規則相匹配的時候,訊息會被髮送到匹配的訊息佇列中. Fanout是路由廣播的形式,將會把訊息發給繫結它的全部佇列,即便設定了key,也會被忽略. 注意:關於bingkey : 在rabbit 管理介面中,沒有這個引數,但是你操作交換機與佇列繫結時,就默認了兩者的關係。同時還有一點需要注意:關於routingkey 它是用來匹配的,但是它是用於匹配與之繫結的佇列的名字(這點很多說明介紹文件中沒有提,導致我一直以為routing key 只要設定好,然後在訊息進行交換機後,會對你傳送訊息中的routingkey 與匹配 交換機與佇列繫結時設定的key,導致資料一直接收不到) 本文參考:http://terry0501.iteye.com/blog/2329580
在程式中申明一個廣播式交換器的程式碼如下: channel.exchange_declare(exchange='fanout',type='fanout')
如圖:Q1,Q2兩個佇列繫結到了直接交換器X上,Q1的binding_key是“orange”,Q2有兩個繫結,一個binding_key是black,另一個binding_key是green。在這樣的關係下,一個帶有 “orange” routing_key的訊息傳送到X交換器之後將會被X路由到佇列Q1,一個帶有 “black” 或者 “green” routing_key的訊息傳送到X交換器之後將會被路由到Q2。而所有其他訊息將會被丟失掉。 主題式交換器(Topic Exchange) 該類交換器通過訊息的Routing Key與Binding Key的模式匹配,將訊息轉發至所有符合繫結規則的佇列中。Binding Key支援萬用字元,其中“*”匹配一個片語,“#”匹配多個片語(包括零個)。例如,Binding Key=“*.Cloud.#”可轉發Routing Key=“OpenStack.Cloud.GD.GZ”、“OpenStack.Cloud.Beijing”以及“OpenStack.Cloud”的訊息,但是對於Routing Key=“Cloud.GZ”的訊息是無法匹配的。
這裡的routing_key可以使用一種類似正則表示式的形式,但是特殊字元只能是“*”和“#”,“*”代表一個單詞,“#”代表0個或是多個單詞。這樣傳送過來的訊息如果符合某個queue的routing_key定義的規則,那麼就會轉發給這個queue。 緊接著說一下交換機.交換機的主要作用是接收相應的訊息並且繫結到指定的佇列.交換機有四種類型,分別為Direct,topic,headers,Fanout. Direct是RabbitMQ預設的交換機模式,也是最簡單的模式.即建立訊息佇列的時候,指定一個BindingKey.當傳送者傳送訊息的時候,指定對應的Key.當Key和訊息佇列的BindingKey一致的時候,訊息將會被髮送到該訊息佇列中. topic轉發資訊主要是依據萬用字元,佇列和交換機的繫結主要是依據一種模式(萬用字元+字串),而當傳送訊息的時候,只有指定的Key和該模式相匹配的時候,訊息才會被髮送到該訊息佇列中. headers也是根據一個規則進行匹配,在訊息佇列和交換機繫結的時候會指定一組鍵值對規則,而傳送訊息的時候也會指定一組鍵值對規則,當兩組鍵值對規則相匹配的時候,訊息會被髮送到匹配的訊息佇列中. Fanout是路由廣播的形式,將會把訊息發給繫結它的全部佇列,即便設定了key,也會被忽略. 注意:關於bingkey : 在rabbit 管理介面中,沒有這個引數,但是你操作交換機與佇列繫結時,就默認了兩者的關係。同時還有一點需要注意:關於routingkey 它是用來匹配的,但是它是用於匹配與之繫結的佇列的名字(這點很多說明介紹文件中沒有提,導致我一直以為routing key 只要設定好,然後在訊息進行交換機後,會對你傳送訊息中的routingkey 與匹配 交換機與佇列繫結時設定的key,導致資料一直接收不到) 本文參考:http://terry0501.iteye.com/blog/2329580