RabbitMQ是如何實現(xiàn)消息路由的?
?1.工作流程
RabbitMQ 是一個基于 AMQP 協(xié)議實現(xiàn)的分布式消息中間件。AMQP 的具體工作機制是,
生產(chǎn)者把消息發(fā)送到 RabbitMQ Broker 上的Exchange 交換機上。Exchange 交換機把收到的消息根據(jù)路由規(guī)則發(fā)給綁定的隊列(Queue)。最后再把消息投遞給訂閱了這個隊列的消費者,從而完成消息的異步通訊。
其中,Exchange交換機,可以定義消息的路由規(guī)則,將消息路由到指定的隊列。然后 Queue隊列是消息的載體,每個消息可以根據(jù)路由規(guī)則路由到一個或者多個隊列中。
2.路由策略
完成RabbitMQ消息路由的核心組件是 Exchange。而消息的路由是由Exchange類型 和 Binding 來決定的。Binding 表示建立 Queue 和 Exchange 之間的綁定關(guān)系,每一個綁定關(guān)系會存在一個 BindingKey。
通過這種方式相當于在 Exchange 中建立了一個路由關(guān)系表。生產(chǎn)者發(fā)送消息的時候,需要聲明一個 RoutingKey(路由鍵),Exchange 拿到RoutingKey 之后,根據(jù) RoutingKey 和路由表里面的 BindingKey 進行匹配,而匹配的規(guī)則是通過 Exchange類型來決定的。
在 RabbitMQ 中,默認有四種類型的 Exchange:Direct ,F(xiàn)anout、Topic和Header。
Direct,叫直連,也就是完整匹配方式,需要Routing Key 和 Binding Key 完全一致,相當于點對點的發(fā)送。如圖所示:
如果發(fā)送routing key為”spring”的消息,那么只有第一個隊列能收到消息。
Topic:叫主題,這種方式是通過設(shè)置通配符來動態(tài)匹配,相當于正則。就是用Routing Key 去匹配Binging Key。BingingKey支持兩個通配符。
代表匹配0個或者多個單詞
* 代表匹配不多不少一個單詞
另外,BingingKey用點隔開兩個單詞。
用*表示使用正則表達式進行匹配,如圖所示:
有4個隊列綁定到Topic類型的交換機,而且使用不同的綁定鍵。
如果發(fā)送routing key為"junior.abc.jvm" 的消息,那么,只有第一個隊列能收到。
如果發(fā)送routing key為"senior.netty"的消息,那么,第二個隊列和第三個隊列能收到。
Fanout:叫廣播,這種方式不需要設(shè)置Routing Key,而是把消息廣播給綁定到當前 Exchange 上的所有隊列上。如圖所示:
只要發(fā)送消息到Fanout Exchange上,那么三個隊列都能收到消息
RabbitMQ、Kafka、RocketMQ 是目前最主流的分布式消息中間件。有的同學可能對 Kafka 比較了解,有的同學可能對 RabbitMQ 比較了解。不過,在面試的時候,面試官一般會問你用過的技術(shù)組件。通過面試過程中推演出你的學習能力以及對技術(shù)的掌握能力,這個方面如果還不錯的話,接觸一個新的 MQ 組件所消耗的學習成本會比較小。