首先MQ是什么?
MQ是Message Queue消息隊(duì)列的縮寫。消息隊(duì)列是一種應(yīng)用程序?qū)?yīng)用程序的通信方法、應(yīng)用程序通過寫和檢索入列隊(duì)的針對(duì)應(yīng)用程序的數(shù)據(jù)(消息)來進(jìn)行通信,而不需要專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發(fā)送數(shù)據(jù)進(jìn)行通信,而不是通過直接調(diào)用彼此來通信,直接調(diào)用通常是用于諸如遠(yuǎn)程過程調(diào)用的技術(shù)。排隊(duì)指的是應(yīng)用程序通過隊(duì)列來通信,隊(duì)列的使用除去了接收和發(fā)送應(yīng)用程序同時(shí)執(zhí)行的要求。
消息中間件的概況?
消息隊(duì)列技術(shù)是分布式應(yīng)用間交換信息的一種技術(shù),消息隊(duì)列可駐留在內(nèi)存或者磁盤上,隊(duì)列存儲(chǔ)消息直到它們被應(yīng)用程序讀走,通過消息隊(duì)列,應(yīng)用程序可獨(dú)立的執(zhí)行---它們不需要知道彼此的位置。或者繼續(xù)執(zhí)行前不需要等待接收程序接收此消息。
MQ相關(guān)的概念:
(1)消息Message
消息是MQ中最小的概念,本質(zhì)上是一段數(shù)據(jù),它能被一個(gè)或者多個(gè)應(yīng)用程序所理解。是應(yīng)用程序之間傳遞的信息載體、
(2)隊(duì)列Queue
a、本地隊(duì)列
本地隊(duì)列按照功能能劃分為初始化隊(duì)列,傳輸隊(duì)列、目標(biāo)隊(duì)列、死信隊(duì)列
初始化隊(duì)列:用作消息觸發(fā)功能。
傳輸隊(duì)列:只是暫存待傳的消息,條件許可的情況下,通過管道將消息傳送到其他的隊(duì)列管理器。
目標(biāo)隊(duì)列:是消息的目的地,可以長(zhǎng)期存放消息。
死信隊(duì)列:當(dāng)消息不能送到目標(biāo)隊(duì)列,也不再路由出去。則自動(dòng)放入死信隊(duì)列保存。
b、別名隊(duì)列和遠(yuǎn)程隊(duì)列
只是一個(gè)隊(duì)列的定義,用來指定遠(yuǎn)程隊(duì)列管理器的隊(duì)列、使用了遠(yuǎn)程隊(duì)列,程序就不需要知道目標(biāo)隊(duì)列的位置、
c、模型隊(duì)列
模型隊(duì)列定義了一套本地隊(duì)列的屬性結(jié)合。一旦打開模型隊(duì)列,隊(duì)列管理器會(huì)按照這些屬性動(dòng)態(tài)的創(chuàng)建出一個(gè)本地隊(duì)列。
(3)隊(duì)列管理器(Queue Manager)
隊(duì)列管理器時(shí)一個(gè)負(fù)責(zé)向應(yīng)用程序提供消息服務(wù)的機(jī)構(gòu),如果把隊(duì)列管理器比作數(shù)據(jù)庫,那么隊(duì)列就是其中的一張表、
(4)通道(Channel)
通道是兩個(gè)管理器之間的一種單向點(diǎn)對(duì)點(diǎn)的通信連接,若需要雙向交流,可以建立一對(duì)通道。
(5)監(jiān)聽器(listener)
MQ產(chǎn)品特性
可靠性傳輸:這個(gè)特點(diǎn)是消息中間件的立足之本,對(duì)應(yīng)用來說,只要成功把數(shù)據(jù)提交個(gè)消息中間件,那么關(guān)于數(shù)據(jù)可靠傳輸?shù)膯栴}就由消息中間件來負(fù)責(zé)。
不重復(fù)傳輸 :不重復(fù)傳輸也就是斷點(diǎn)續(xù)傳的功能,特別適合在網(wǎng)絡(luò)不穩(wěn)定的環(huán)境,節(jié)約網(wǎng)絡(luò)資源。
異步傳輸:接受信息雙方不必同時(shí)在線,具有脫機(jī)能力和安全性。
消息驅(qū)動(dòng):接到消息后主動(dòng)通知消息接收方
支持事務(wù):應(yīng)用程序可以把一些數(shù)據(jù)更新組合成一個(gè)工作單元,這些更新通常是邏輯相關(guān)的,為了保障數(shù)據(jù)完整性,所有的更新必須同時(shí)成功或者同時(shí)失敗。
MQ應(yīng)用場(chǎng)景:
MQ消息隊(duì)列是應(yīng)用松耦合的概念而產(chǎn)生的,主要以隊(duì)列和發(fā)布訂閱為消息傳輸機(jī)制,以異步的方式將消息可靠的傳輸?shù)较⒍恕K粡V泛的應(yīng)用與跨平臺(tái),跨系統(tǒng)的分布式系統(tǒng)之間,為它們提供高效可靠的異步傳輸機(jī)制。
先了解一下發(fā)布-訂閱消息模式
有些網(wǎng)站在注冊(cè)用戶成功后發(fā)一封激活郵件,用戶收到郵件后點(diǎn)擊激活鏈接后才能使用該網(wǎng)站。一般的做法是在注冊(cè)用戶業(yè)務(wù)邏輯中調(diào)用發(fā)送郵件的邏輯。這 樣用戶業(yè)務(wù)就依賴于郵件業(yè)務(wù)。如果以后改為短信激活,注冊(cè)用戶業(yè)務(wù)邏輯就必須修改為調(diào)用發(fā)送短信的邏輯。如果要注冊(cè)后給用戶加點(diǎn)積分,再加一段邏輯。經(jīng)過 多次修改,我們發(fā)現(xiàn)很簡(jiǎn)單的注冊(cè)用戶業(yè)務(wù)已經(jīng)越來越復(fù)雜,越來越難以維護(hù)。相信很多開發(fā)者都會(huì)有類似痛苦的經(jīng)歷。
即使用戶業(yè)務(wù)實(shí)現(xiàn)中對(duì)其他業(yè)務(wù)是接口依賴,也避免不了業(yè)務(wù)變化帶來的依賴影響。怎么辦?解耦!將注冊(cè)用戶業(yè)務(wù)邏輯中注冊(cè)成功后的處理剝離出來。
再回頭看看"訂閱雜志",如果沒有郵局,出版社就必須自己將雜志送達(dá)所有消費(fèi)者。這種情形就和現(xiàn)在的注冊(cè)用戶業(yè)務(wù)一樣。我們發(fā)現(xiàn)問題了,在用戶業(yè)務(wù)和其他業(yè)務(wù)之間缺少了郵局所扮角色。
我們把郵局抽象成一個(gè)管理消息的地方,叫"消息管理器"。注冊(cè)用戶成功后發(fā)送一個(gè)消息給消息管理器,由消息管理器轉(zhuǎn)發(fā)該消息給需要處理的業(yè)務(wù)?,F(xiàn)在,用戶業(yè)務(wù)只依賴于消息管理器了,它再也不會(huì)為了注冊(cè)用戶成功后的其他處理而煩惱。
注冊(cè)用戶的改造就是借鑒了"訂閱雜志"這樣原始的模式。我們?cè)龠M(jìn)一步抽象,用戶業(yè)務(wù)就是消息的"生產(chǎn)者",它將消息發(fā)布到消息管理器。郵件業(yè)務(wù)就是 消息的"消費(fèi)者",它將收到的消息進(jìn)行處理。郵局可以訂閱很多種雜志,雜志都是通過某種編號(hào)來區(qū)分;消息管理器也可以管理多種消息,每種消息都會(huì)有一個(gè) "主題"來區(qū)分,消費(fèi)者都是通過主題來訂閱的。
消息通道(MessageChannel)使用MQ將彼此協(xié)作的客戶端和服務(wù)端連接起來,使它們可以交換消息。
若客戶端和服務(wù)端需要安全可靠的交互,可以將一個(gè)MQ隊(duì)列作為安全通道,是客戶端與服務(wù)端能夠安全高效的進(jìn)行
異步通訊。
消息總線(Message Bus)
對(duì)于許多獨(dú)立開發(fā)的服務(wù)組成的分布式系統(tǒng),若要將他們組成一個(gè)完整的系統(tǒng),這些服務(wù)必須能夠可靠的交互,同時(shí),為了系統(tǒng)的健壯性,每個(gè)服務(wù)之間又不能過分緊密的依賴,這樣就可以通過消息總線將不同的服務(wù)連接起來,允許它們異步的傳遞數(shù)據(jù)。
消息路由:通過消息路由,可以將發(fā)送到MQ指定隊(duì)列的消息根據(jù)規(guī)則路由到不同的隊(duì)列。





