說明:本文屬於半轉載,內部有自己的總結;
簡介:
RabbitMQ中,所有生產者提交的消息都由Exchange來接受,然後Exchange按照特定的策略轉發到Queue進行存儲
RabbitMQ提供了四種Exchange:fanout,direct,topic,header
header模式在實際使用中較少,本文只對前三種模式進行比較,除了其匹配規則是匹配header中的參數外,其餘的和direct很相似,但是性能相差甚遠。
一.Direct Exchange
任何發送到Direct Exchange的消息都會被轉發到RouteKey中指定的Queue。
- 一般情況可以使用rabbitMQ自帶的Exchange:””(該Exchange的名字爲空字符串,下文稱其爲default Exchange)。
- 這種模式下不需要將Exchange進行任何綁定(binding)操作
- 消息傳遞時需要一個“RouteKey”,可以簡單的理解爲要發送到的隊列名字。
- 如果vhost中不存在RouteKey中指定的隊列名,則該消息會被拋棄。
一些說明:
- 實現 指定類型的消息只能被部分隊列消費, 我們可以通過direct的routingkey 在綁定交換機和隊列的時候 指定消息傳遞的路徑;
- 相較於topic-exchange ,direct-exchange有一個缺點:routingkey 路由 只能完全匹配;
二.Fanout Exchange
任何發送到Fanout Exchange的消息都會被轉發到與該Exchange綁定(Binding)的所有Queue上。
- 可以理解爲路由表的模式
- 這種模式不需要RouteKey
- 這種模式需要提前將Exchange與Queue進行綁定,一個Exchange可以綁定多個Queue,一個Queue可以同多個Exchange進行綁定。
- 如果接受到消息的Exchange沒有與任何Queue綁定,則消息會被拋棄。
一些說明:
- 可以有多個消費者,但是隻有一個消費者可以消費成功;
- 扇形交換器,無腦的廣播消息給所有與之綁定的隊列;
- 聲明一個交換機,其中倆參數說明:
(1)durable:是否持久化,如果true,則當前RabbitMQ重啓的時候,它依舊存在
(2)autoDelete:當沒有生成者/消費者使用此交換機時,此交換機會被自動刪除。- 聲明代碼:
// 聲明一個fanout交換機 channel.exchangeDeclare(EXCHANGE_NAME,BuiltinExchangeType.FANOUT, false, false, null); // 發送消息 channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
- 扇形交換機的消息傳遞是 只要綁定了這個交換機 就可以消費消息,所以Routingkey沒有用;
三.Topic Exchange
任何發送到Topic Exchange的消息都會被轉發到所有關心RouteKey中指定話題的Queue上
- 這種模式較爲複雜,簡單來說,就是每個隊列都有其關心的主題,所有的消息都帶有一個“標題”(RouteKey),Exchange會將消息轉發到所有關注主題能與RouteKey模糊匹配的隊列。
- 這種模式需要RouteKey,也許要提前綁定Exchange與Queue。
- 在進行綁定時,要提供一個該隊列關心的主題,如“#.log.#”表示該隊列關心所有涉及log的消息(一個RouteKey爲”MQ.log.error”的消息會被轉發到該隊列)。
- “#”表示0個或若干個關鍵字,“”表示一個關鍵字。如“log.”能與“log.warn”匹配,無法與“log.warn.timeout”匹配;但是“log.#”能與上述兩者匹配。
一些說明:
- 路由鍵中特殊匹配字符說明
(1)*(星號)可以代替一個字。
(2)#(散列)可以代替零個或多個單詞。- 路由鍵條件:
(1)必須由英文字符組成,使用“.”號隔開;
(2)路由鍵的長度 最長255字節;
5.同樣,如果Exchange沒有發現能夠與RouteKey匹配的Queue,則會拋棄此消息。
版權聲明:本文爲CSDN博主「道秋adol」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/chendaoqiu/article/details/48440633