前言:MQ 的本質(zhì)是什么呢? 消息隊(duì)列,又叫做消息中間件。是指用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無(wú)關(guān)的數(shù)據(jù)交流太雨,并基于數(shù)據(jù)通信來(lái)進(jìn)行分布式系統(tǒng)的集成。通過(guò)提供消息傳遞和消息隊(duì)列模型茫蛹,可以在分布式環(huán)境下擴(kuò)展進(jìn)程的通信(維基百科)操刀。
1.為什么要使用 MQ?
1)實(shí)現(xiàn)異步通信
2)實(shí)現(xiàn)系統(tǒng)解耦
3)實(shí)現(xiàn)流量削峰
MQ 既然是隊(duì)列,就有先進(jìn)先出的特性婴洼,這樣骨坑,我們就可以先把所有的流量承接下來(lái),轉(zhuǎn)換成 MQ 消息發(fā)送到消息隊(duì)列服務(wù)器上柬采,業(yè)務(wù)層就可以根據(jù)自己的消費(fèi)速率去處理這些消息欢唾,處理之后再返回結(jié)果。就像我們?cè)诨疖囌九抨?duì)一樣粉捻,大家只能一個(gè)一個(gè)買票礁遣,不會(huì)因?yàn)槿硕嗑蛯?dǎo)致售票員忙不過(guò)來(lái)。如果要處理快一點(diǎn)肩刃,大不了多開(kāi)幾個(gè)窗口(增加幾個(gè)消費(fèi)者)祟霍。
2.RabbitMQ 簡(jiǎn)介
1)基本特性:
1. 高可靠:RabbitMQ 提供了多種多樣的特性讓你在可靠性和性能之間做出權(quán)衡,包 括持久化盈包、發(fā)送應(yīng)答浅碾、發(fā)布確認(rèn)以及高可用性。2.靈活的路由:通過(guò)交換機(jī)(Exchange)實(shí)現(xiàn)消息的靈活路由续语。3.支持多客戶端:對(duì)主流開(kāi)發(fā)語(yǔ)言(Python垂谢、Java、Ruby疮茄、PHP滥朱、C#、JavaScript力试、Go徙邻、Elixir、Objective-C畸裳、Swift 等)都有客戶端實(shí)現(xiàn)缰犁。4.集群與擴(kuò)展性:多個(gè)節(jié)點(diǎn)組成一個(gè)邏輯的服務(wù)器,支持負(fù)載怖糊。5.高可用隊(duì)列:通過(guò)鏡像隊(duì)列實(shí)現(xiàn)隊(duì)列中數(shù)據(jù)的復(fù)制帅容。6.權(quán)限管理:通過(guò)用戶與虛擬機(jī)實(shí)現(xiàn)權(quán)限管理。7.插件系統(tǒng):支持各種豐富的插件擴(kuò)展伍伤,同時(shí)也支持自定義插件并徘。8.與 Spring 集成:Spring 對(duì) AMQP 進(jìn)行了封裝。
2)AMQP 協(xié)議
1.總體介紹:高級(jí)消息隊(duì)列協(xié)議扰魂,是一個(gè)工作于應(yīng)用層的協(xié)議麦乞,最新的版本是 1.0 版本蕴茴。
2.工作模型:由于 RabbitMQ 實(shí)現(xiàn)了 AMQP 協(xié)議,所以 RabbitMQ 的工作模型也是基于 AMQP的
名詞解釋:1)Broker:這臺(tái) RabbitMQ 的服務(wù)器我們把它叫做 Broker姐直,中文翻譯是代理/中介倦淀,因?yàn)?MQ 服務(wù)器幫助我們做的事情就是存儲(chǔ)、轉(zhuǎn)發(fā)消息声畏。 2)Connection:無(wú)論是生產(chǎn)者發(fā)送消息晃听,還是消費(fèi)者接收消息,都必須要跟 Broker 之間建立一個(gè)連接砰识,這個(gè)連接是一個(gè) TCP 的長(zhǎng)連接。3)Channel:它是一個(gè)虛擬的連接佣渴。我們把它翻譯成通道辫狼,或者消息信道。為了解決所有的生產(chǎn)者發(fā)送消息和消費(fèi)者接收消息辛润,都直接創(chuàng)建和釋放 TCP 長(zhǎng)連接的話膨处,對(duì)于 Broker 來(lái)說(shuō)肯定會(huì)造成很大的性能損耗的問(wèn)題 4)Queue:隊(duì)列是真正用來(lái)存儲(chǔ)消息的,是一個(gè)獨(dú)立運(yùn)行的進(jìn)程砂竖,有自己的數(shù)據(jù)庫(kù)(Mnesia)真椿。消費(fèi)者獲取消息有兩種模式,一種是 Push 模式乎澄,只要生產(chǎn)者發(fā)到服務(wù)器突硝,就馬上推送給消費(fèi)者。另一種是 Pull 模式置济,消息存放在服務(wù)端解恰,只有消費(fèi)者主動(dòng)獲取才能拿到消息。消費(fèi)者需要寫一個(gè) while 循環(huán)不斷地從隊(duì)列獲取消息嗎?不需要浙于,我們可以基于事件機(jī)制护盈,實(shí)現(xiàn)消費(fèi)者對(duì)隊(duì)列的監(jiān)聽(tīng)。5)Exchange:用來(lái)實(shí)現(xiàn)消息的靈活路由羞酗,交換機(jī)是一個(gè)綁定列表腐宋,用來(lái)查找匹配的綁定關(guān)系。隊(duì)列使用綁定鍵(Binding Key)跟交換機(jī)建立綁定關(guān)系檀轨。6)Vhost:VHOST是虛擬主機(jī)胸竞, 除了可以提高硬件資源的利用率之外,還可以實(shí)現(xiàn)資源的隔離和權(quán)限的控制参萄。它的作用類似于編程語(yǔ)言中的 namespace 和 package撤师,不同的 VHOST 中可以有同名的 Exchange 和 Queue,它們是完全透明的拧揽。
3)路由方式-交換機(jī)
1.直連 Direct:隊(duì)列與直連類型的交換機(jī)綁定剃盾,需指定一個(gè)精確的綁定鍵腺占。生產(chǎn)者發(fā)送消息時(shí)會(huì)攜帶一個(gè)路由鍵。只有當(dāng)路由鍵與其中的某個(gè)綁定鍵完全匹配時(shí)痒谴,這條消息才會(huì)從交換機(jī)路由到滿足路由關(guān)系的此隊(duì)列上衰伯。
2.主題 Topic:隊(duì)列與主題類型的交換機(jī)綁定時(shí),可以在綁定鍵中使用通配符积蔚。兩個(gè)通配符:# 表示0 個(gè)或者多個(gè)單詞? ? * 表示不多不少一個(gè)單詞(單詞(word)指的是用英文的點(diǎn)“.”隔開(kāi)的字符意鲸。例如 abc.def 是兩個(gè)單詞)。
3.廣播 Fanout:主題類型的交換機(jī)與隊(duì)列綁定時(shí)尽爆,不需要指定綁定鍵怎顾。因此生產(chǎn)者發(fā)送消息到廣播類型的交換機(jī)上,也不需要攜帶路由鍵漱贱。消息達(dá)到交換機(jī)時(shí)槐雾,所有與之綁定了的隊(duì)列,都會(huì)收到相同的消息的副本幅狮。