RabbitMQ消息處理機制fanout,direct,topic,header

RabbitMQ中,所有生產者提交的消息都由Exchange來接受,然後Exchange按照特定的策略轉發到Queue進行存儲

RabbitMQ提供了四種Exchange:fanout,direct,topic,header

header模式在實際使用中較少,本文只對前三種模式進行比較。

 

性能排序:fanout > direct >> topic。比例大約爲11:10:6

 

一.Direct Exchange

0ec0f465-49c6-361c-ae2b-dd951a6ed1a9

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

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

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

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

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

 

二.Fanout Exchange 

0bbdcd3d-9fc6-3107-b7e0-db67c174d46a

 

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

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

2.這種模式不需要RouteKey

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

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

 

三.Topic Exchange

11171ab4-af07-3ff6-bdf6-d1febda679c3

 

任何發送到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,則會拋棄此消息。

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