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