RabbitMQ三種Exchange模式(fanout,direct,topic)的性能比較
- RabbitMQ中,除了Simple Queue和Work Queue之外的所有生產者提交的消息都由Exchange來接受,然后Exchange按照特定的策略轉發到Queue進行存儲。
- RabbitMQ提供了四種Exchange:fanout,direct,topic,header
- header模式在實際使用中較少
- **性能排序:fanout>direct>>topic。比例大約為11:10:6
Direct Exchange
-
-
任何發送到Direct Exchange的消息都會被轉發到RouteKey中指定的queue
- 一般情況下可以使用rabbitMQ自帶的Exchange:“”(該Exchange的名字為空字符串,下文稱其為defaultExchange)。
- 這種模式下不需要將Exchange進行任何綁定(binding)操作。
- 消息傳遞時需要一個“RouteKey(其實是QueueName)”,可以簡單的理解為要發送的隊列名字。相當於上面提到的Simple Queue和Work Queue.
- 如果vhost中不存在RouteKey中指定的隊列名,則該消息被拋棄。
Fanout Exchange
-
-
任何發送到Fanout Exchange的消息都會被轉發到與該Exchange綁定(Binding)的Queue上
- 可以理解為路由表的模式
- 這種模式不需要RouteKey
- 這種模式需要提前將Exchange與Queue進行綁定,一個Exchange可以綁定多個Queue,一個Queue可以同多個Exchange進行綁定
- 如果接受消息的Exchange沒有和任何Queue綁定,則消息被拋棄
Topic Exchange
-
-
任何發送到Topic Exchange的消息都會被轉發到所有關心RouteKey中指定話題的Queue上
- 這種模式較為復雜,簡單來說,就是每個隊列都有其關心的主題(通過BindingKey來說明),所有的消息都帶有一個“標題”(Route Key),Exchange會將消息轉發到所有關注主題能夠和RouteKey模糊匹配的隊列。匹配規則使用通配符“#”和“*”。
- 這種模式需要RouteKey,也要提前綁定Exchange與Queue。綁定之后Exchange才能夠判斷隊列關心的主題是否與RouteKey匹配。
- 在進行綁定時,需要提供一個該隊列關系的主題,如“#.log.#”表示該隊列關系所有涉及log的消息(一個RouteKey為“MQ.log.error”的消息就會被轉發給該隊列)
- 同樣,如果Exchange沒有任何發現能夠與RouteKey匹配的Queue,則會拋棄該消息。