更新時(shí)間:2021-09-28 來(lái)源:黑馬程序員 瀏覽量:
消息隊(duì)列,英文名:Message Queue,經(jīng)??s寫(xiě)為MQ。從字面上來(lái)理解,消息隊(duì)列是一種用來(lái)存儲(chǔ)消息的隊(duì)列。來(lái)看一下下面的代碼:
// 1. 創(chuàng)建一個(gè)保存字符串的隊(duì)列 Queue<String> stringQueue = new LinkedList<String>(); // 2. 往消息隊(duì)列中放入消息 stringQueue.offer("hello"); // 3. 從消息隊(duì)列中取出消息并打印 System.out.println(stringQueue.poll());
上述代碼,創(chuàng)建了一個(gè)隊(duì)列,先往隊(duì)列中添加了一個(gè)消息,然后又從隊(duì)列中取出了一個(gè)消息。這說(shuō)明了隊(duì)列是可以用來(lái)存取消息的。我們可以簡(jiǎn)單理解消息隊(duì)列就是將需要傳輸?shù)臄?shù)據(jù)存放在隊(duì)列中。
消息隊(duì)列中間件是用來(lái)存儲(chǔ)消息的軟件(組件)。舉個(gè)例子來(lái)理解,為了分析網(wǎng)站的用戶(hù)行為,我們需要記錄用戶(hù)的訪(fǎng)問(wèn)日志。這些一條條的日志,可以看成是一條條的消息,我們可以將它們保存到消息隊(duì)列中。將來(lái)有一些應(yīng)用程序需要處理這些日志,就可以隨時(shí)將這些消息取出來(lái)處理。
目前市面上的消息隊(duì)列有很多,例如:Kafka、RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ等。
消息隊(duì)列的應(yīng)用場(chǎng)景
1.異步處理
電商網(wǎng)站中,新的用戶(hù)注冊(cè)時(shí),需要將用戶(hù)的信息保存到數(shù)據(jù)庫(kù)中,同時(shí)還需要額外發(fā)送注冊(cè)的郵件通知、以及短信注冊(cè)碼給用戶(hù)。但因?yàn)榘l(fā)送郵件、發(fā)送注冊(cè)短信需要連接外部的服務(wù)器,需要額外等待一段時(shí)間,此時(shí),就可以使用消息隊(duì)列來(lái)進(jìn)行異步處理,從而實(shí)現(xiàn)快速響應(yīng)。
2.系統(tǒng)解耦
如果庫(kù)存系統(tǒng)出現(xiàn)問(wèn)題,會(huì)導(dǎo)致訂單系統(tǒng)下載失敗。而且如果庫(kù)存系統(tǒng)接口修改了,會(huì)導(dǎo)致訂單系統(tǒng)也無(wú)法工作。
使用消息隊(duì)列可以實(shí)現(xiàn)系統(tǒng)與系統(tǒng)之間的解耦,訂單系統(tǒng)不再調(diào)用庫(kù)存系統(tǒng)接口,而是把2訂單消息寫(xiě)入到消息隊(duì)列。庫(kù)存系統(tǒng)從消息系統(tǒng)中拉取消息,然后再減庫(kù)存,從而實(shí)現(xiàn)系統(tǒng)解耦。
3.流量削峰
4.日志處理(大數(shù)據(jù)領(lǐng)域常見(jiàn))
大型電商網(wǎng)站(淘寶、京東、國(guó)美、蘇寧...)、App(抖音、美團(tuán)、滴滴等)等需要分析用戶(hù)行為,要根據(jù)用戶(hù)的訪(fǎng)問(wèn)行為來(lái)發(fā)現(xiàn)用戶(hù)的喜好以及活躍情況,需要在頁(yè)面上收集大量的用戶(hù)訪(fǎng)問(wèn)信息。
5.生產(chǎn)者、消費(fèi)者模型
我們之前學(xué)習(xí)過(guò)Java的服務(wù)器開(kāi)發(fā),Java服務(wù)器端開(kāi)發(fā)的交互模型是這樣的:
我們之前也學(xué)習(xí)過(guò)使用Java JDBC來(lái)訪(fǎng)問(wèn)操作MySQL數(shù)據(jù)庫(kù),它的交互模型是這樣的:
它也是一種請(qǐng)求響應(yīng)模型,只不過(guò)它不再是基于http協(xié)議,而是基于MySQL數(shù)據(jù)庫(kù)的通信協(xié)議。
而如果我們基于消息隊(duì)列來(lái)編程,此時(shí)的交互模式成為:生產(chǎn)者、消費(fèi)者模型。
猜你喜歡:
怎樣能保障Kafka儲(chǔ)存的數(shù)據(jù)不丟失?