(七) RabbitMQ的消息路由機制四種Exchange模式(fanout,direct,topic,header)

一.Direct Exchange

 

任何發送到Direct Exchange的消息都會被轉發到RouteKey中指定的Queue

1.一般情況可以使用rabbitMQ自帶的Exchange:”"(該Exchange的名字爲空字符串,下文稱其爲default Exchange)。

2.這種模式下不需要將Exchange進行任何綁定(binding)操作

3.消息傳遞時需要一個“RouteKey”,可以簡單的理解爲要發送到的隊列名字。

4.如果vhost中不存在RouteKey中指定的隊列名,則該消息會被拋棄。

消息中的路由鍵(routing key)如果和 Binding 中的 binding key 一致, 交換器就將消息發到對應的隊列中。路由鍵與隊列名完全匹配,如果一個隊列綁定到交換機要求路由鍵爲“dog”,則只轉發 routing key 標記爲“dog”的消息,不會轉發“dog.puppy”,也不會轉發“dog.guard”等等。它是完全匹配、單播的模式。

二.Fanout Exchange 

 

任何發送到Fanout Exchange的消息都會被轉發到與該Exchange綁定(Binding)的所有Queue上。

1.可以理解爲路由表的模式

2.這種模式不需要RouteKey

3.這種模式需要提前將Exchange與Queue進行綁定,一個Exchange可以綁定多個Queue,一個Queue可以同多個Exchange進行綁定。

4.如果接受到消息的Exchange沒有與任何Queue綁定,則消息會被拋棄。

每個發到 fanout 類型交換器的消息都會分到所有綁定的隊列上去。fanout 交換器不處理路由鍵,只是簡單的將隊列綁定到交換器上,每個發送到交換器的消息都會被轉發到與該交換器綁定的所有隊列上。很像子網廣播,每臺子網內的主機都獲得了一份複製的消息。fanout 類型轉發消息是最快的。

三.Topic Exchange

Topic 交換器通過模式匹配分配消息的路由鍵屬性,將路由鍵和某個模式進行匹配,此時隊列需要綁定到一個模式上。它將路由鍵和綁定鍵的字符串切分成單詞,這些單詞之間用點隔開。它同樣也會識別兩個通配符:符號“#”和符號“”。#匹配0個或多個單詞,匹配一個單詞。

 

任何發送到Topic Exchange的消息都會被轉發到所有關心RouteKey中指定話題的Queue上

1.這種模式較爲複雜,簡單來說,就是每個隊列都有其關心的主題,所有的消息都帶有一個“標題”(RouteKey),Exchange會將消息轉發到所有關注主題能與RouteKey模糊匹配的隊列。

2.這種模式需要RouteKey,也許要提前綁定Exchange與Queue。

3.在進行綁定時,要提供一個該隊列關心的主題,如“#.log.#”表示該隊列關心所有涉及log的消息(一個RouteKey爲”MQ.log.error”的消息會被轉發到該隊列)。

4.“#”表示0個或若干個關鍵字,“*”表示一個關鍵字。如“log.*”能與“log.warn”匹配,無法與“log.warn.timeout”匹配;但是“log.#”能與上述兩者匹配。

5.同樣,如果Exchange沒有發現能夠與RouteKey匹配的Queue,則會拋棄此消息。

四.Header Exchange

header模式與routing不同的地方在於,header模式取消routingkey,使用header中的 key/value(鍵值對)匹配隊列。

消息header數據裏有一個特殊的鍵x-match

all: 默認值

一個傳送消息的header裏的鍵值對和交換機的header鍵值對全部匹配,纔可以路由到對應交換機

any: 

一個傳送消息的header裏的鍵值對和交換機的header鍵值對任意一個匹配,就可以路由到對應交換機

Dictionary<string, object> aHeader = new Dictionary<string, object>();
aHeader.Add("format", "pdf");
aHeader.Add("type", "report");
aHeader.Add("x-match", "all");
channel.QueueBind(queue: "queue.A",
                    exchange: "agreements",
                    routingKey: string.Empty,
                    arguments: aHeader);

其中的x-match爲特殊的header,可以爲all則表示要匹配所有的header,如果爲any則表示只要匹配其中的一個header即可。
在發佈消息的時候就需要傳入header值:

Properties properties = channel.CreateBasicProperties();
properties.Persistent = true;
Dictionary<string, object> mHeader1 = new Dictionary<string, object>();
mHeader1.Add("format", "pdf");
mHeader1.Add("type", "report");
properties.Headers = mHeader1;

以上就是exchange 類型的總結,一般來說direct和topic用來具體的路由消息,如果要用廣播的消息一般用fanout的exchange。

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