Messges Queue消息隊(duì)列詳解
1、什么是消息隊(duì)列
消息隊(duì)列一般簡稱為 MQ (Messges Queue),是指利用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成,是在消息的傳輸過程中保存消息的容器。
消息隊(duì)列本質(zhì)上是一個(gè)隊(duì)列,而隊(duì)列中存放的是一個(gè)個(gè)消息。
隊(duì)列是一個(gè)數(shù)據(jù)結(jié)構(gòu),具有先進(jìn)先出的特點(diǎn)。
而消息隊(duì)列就是將消息放到隊(duì)列里,用隊(duì)列做存儲消息的介質(zhì)。
消息的發(fā)送放稱為生產(chǎn)者,消息的接收方稱為消費(fèi)者。
消息隊(duì)列由 Broker(消息服務(wù)器,核心部分)、Producer(消息生產(chǎn)者)、Consumer(消息消費(fèi)者)、Topic(主題)、Queue(隊(duì)列)和Message(消息體)組成。
2、消息隊(duì)列特點(diǎn)
- 流量削峰:主要用于在高并發(fā)情況下,業(yè)務(wù)異步處理,提供高峰期業(yè)務(wù)處理能力,避免系統(tǒng)癱瘓。
假設(shè)系統(tǒng)只能處理1000個(gè)請求,但這時(shí)突然來了3000個(gè)請求,如果不加以限制就會造成系統(tǒng)癱瘓。使用消息隊(duì)列做緩沖,將多余的請求存放在消息隊(duì)列中,等系統(tǒng)根據(jù)自己處理請求的能力去消息隊(duì)列去。
- 應(yīng)用解耦:主要用于當(dāng)一個(gè)業(yè)務(wù)需要多個(gè)模塊共同實(shí)現(xiàn),或者一條消息有多個(gè)系統(tǒng)需要對應(yīng)處理時(shí),只需要主業(yè)務(wù)完成以后,發(fā)送一條MQ,其余模塊消費(fèi)MQ消息,即可實(shí)現(xiàn)業(yè)務(wù),降低模塊之間的耦合。
假設(shè)某個(gè)服務(wù) A 需要調(diào)用服務(wù) B,但是服務(wù) B 突然出現(xiàn)問題,這樣會導(dǎo)致服務(wù) A 也會出現(xiàn)問題。如果使用消息隊(duì)列,當(dāng)服務(wù) A 執(zhí)行完成之后,發(fā)送一條消息到隊(duì)列中,服務(wù) B 讀取到這條消息,那么它立刻開始進(jìn)行業(yè)務(wù)的執(zhí)行。
- 異步通信:主業(yè)務(wù)執(zhí)行結(jié)束后從屬業(yè)務(wù)通過MQ,異步執(zhí)行,減低業(yè)務(wù)的響應(yīng)時(shí)間,提高用戶體驗(yàn)。
假設(shè)有一個(gè)業(yè)務(wù),要先執(zhí)行服務(wù) A ,然后服務(wù) A 去調(diào)用服務(wù) B ,當(dāng)服務(wù) B 完成之后,服務(wù) A 調(diào)用服務(wù) C,這個(gè)業(yè)務(wù)需要一步步走下去。當(dāng)使用了消息隊(duì)列之后,服務(wù) A 完成之后,可以同時(shí)執(zhí)行服務(wù) B 和 服務(wù) C ,這樣就減低業(yè)務(wù)的響應(yīng)時(shí)間,提高用戶體驗(yàn)。
3、消息隊(duì)列的的傳輸模式
- 點(diǎn)對點(diǎn)模式:用于消息生產(chǎn)者和消息消費(fèi)者之間點(diǎn)到點(diǎn)的通信。
消息生產(chǎn)者將消息發(fā)送到Queue(隊(duì)列)中,然后消息消費(fèi)者從Queue(隊(duì)列)找取出消息,當(dāng)消息被消費(fèi)之后就從Queue(隊(duì)列)中刪除,消息只能被一個(gè)消息消費(fèi)者使用。
- 發(fā)布/訂閱模式:消息生產(chǎn)者向一個(gè)特定的Topic(主題)生產(chǎn)消息。0或多個(gè)訂閱了該Topic(主題)的消息消費(fèi)者,接收Topic(主題)的消息, 在這種情況下發(fā)布者和訂閱者彼此不知道。
消息生產(chǎn)者和消息消費(fèi)者只有建立了訂閱關(guān)系才能收到消息。
Topic(主題)實(shí)現(xiàn)了發(fā)布和訂閱,當(dāng)消息生產(chǎn)者發(fā)布一個(gè)消息,所有訂閱這個(gè)Topic(主題)的服務(wù)都能得到這個(gè)消息。
有兩種訂閱類型:
- 持久訂閱:訂閱關(guān)系建立后,消息就不會消失,不管訂閱者是否都在線;
- 非持久訂閱:訂閱者為了接受消息,必須一直在線。 當(dāng)只有一個(gè)訂閱者時(shí)約等于點(diǎn)對點(diǎn)模式
4、常用的消息隊(duì)列
- ActiveMQ:是Apache下的一個(gè)子項(xiàng)目。
- 優(yōu)點(diǎn):單機(jī)吞吐量每秒萬級,時(shí)效性毫秒級,可用性高,基于主從架構(gòu)實(shí)現(xiàn)高可用性,消息可靠性較低的概率丟失數(shù)據(jù)。支持多種語言、支持Spring2.0的特性、支持多種傳送協(xié)議、支持通過JDBC和journal提供高速的消息持久化。
- 缺點(diǎn):官方社區(qū)現(xiàn)在的維護(hù)越來越少;社區(qū)活躍度不高。
- Kafka:是一個(gè)分布式消息發(fā)布訂閱系統(tǒng)。為大數(shù)據(jù)而生的消息中間件,大數(shù)據(jù)的殺手锏
- 優(yōu)點(diǎn):單機(jī)吞吐量每秒百萬級,時(shí)效性毫秒級,不會丟失數(shù)據(jù),不會導(dǎo)致不可用
- 缺點(diǎn):支持消息順序,但是一臺代理宕機(jī)后,就會產(chǎn)生消息亂序;消費(fèi)失敗不支持重試;社區(qū)更新較慢
- RocketMQ:阿里系下開源的一款分布式、隊(duì)列模型的消息中間件,3.0版本名稱改為RocketMQ,是阿里參照 kafka 設(shè)計(jì)思想使用 java 實(shí)現(xiàn)的一套消息隊(duì)列。
- 優(yōu)點(diǎn):單機(jī)吞吐量十萬級,時(shí)效性毫秒級,消息可以做到 0 丟失,支持 10 億級別的消息堆積
- 缺點(diǎn):支持的客戶端語言不多,目前是 java 及 c++;社區(qū)活躍度一般;
- RabbitMQ:是使用Erlang編寫的一個(gè)開源的消息隊(duì)列
- 優(yōu)點(diǎn):單機(jī)吞吐量萬級,時(shí)效性微秒級,支持多種語言
到此這篇關(guān)于Messges Queue消息隊(duì)列詳解的文章就介紹到這了,更多相關(guān)消息隊(duì)列詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring的循環(huán)依賴、三級緩存解決方案源碼詳細(xì)解析
這篇文章主要介紹了Spring的循環(huán)依賴、三級緩存解決方案源碼詳細(xì)解析,在Spring中,由于IOC的控制反轉(zhuǎn),創(chuàng)建對象不再是簡單的new出來,而是交給Spring去創(chuàng)建,會經(jīng)歷一系列Bean的生命周期才創(chuàng)建出相應(yīng)的對象,需要的朋友可以參考下2024-01-01Mybatis select記錄封裝的實(shí)現(xiàn)
這篇文章主要介紹了Mybatis select記錄封裝的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java多線程之readwritelock讀寫分離的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java多線程之readwritelock讀寫分離的相關(guān)內(nèi)容,文中涉及具體實(shí)例代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10Java中Color和16進(jìn)制字符串互相轉(zhuǎn)換的方法
這篇文章主要給大家介紹了關(guān)于Java中Color和16進(jìn)制字符串互相轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07springboot整合websocket后啟動報(bào)錯(cuò)(javax.websocket.server.ServerCont
這篇文章主要介紹了springboot整合websocket后啟動報(bào)錯(cuò)(javax.websocket.server.ServerContainer not available),通過分析錯(cuò)誤信息、排查代碼和配置,找出問題的根源,并給出相應(yīng)的解決方案,感興趣的可以了解一下2024-01-01Java實(shí)現(xiàn)定時(shí)器的4種方法超全總結(jié)
對于一些特殊的代碼是需要定時(shí)執(zhí)行的,下面來看看定時(shí)器該如何編寫吧,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)定時(shí)器的4種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05spring boot實(shí)戰(zhàn)教程之shiro session過期時(shí)間詳解
這篇文章主要給大家介紹了關(guān)于spring boot實(shí)戰(zhàn)教程之shiro session過期時(shí)間的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-10-10Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過程圖解
這篇文章主要介紹了Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08