??推薦閱讀文章??
- ??JavaSE系列????1??《JavaSE系列教程》
- ??MySQL系列????2??《MySQL系列教程》
- ??JavaWeb系列????3??《JavaWeb系列教程》
- ??SSM框架系列????4??《SSM框架系列教程》
??本博客知識(shí)點(diǎn)收錄于??????《RabbitMQ系列教程》??—>??《RabbitMQ系列教程-第一章-消息中間件簡(jiǎn)介》??
一、消息中間件簡(jiǎn)介
1.1 概述
MQ全稱為Message Queue,消息隊(duì)列是消息在傳遞過(guò)程中的容器,消息隊(duì)列常用于分布式系統(tǒng)之間的通信
消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件,主要解決應(yīng)用耦合,異步消息,流量削鋒等問(wèn)題實(shí)現(xiàn)高性能,高可用,可伸縮和最終一致性架構(gòu);使用較多的消息隊(duì)列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ以下介紹消息隊(duì)列在實(shí)際應(yīng)用中常用的使用場(chǎng)景:異步處理,應(yīng)用解耦,流量削鋒和消息通訊四個(gè)場(chǎng)景
1.2 消息中間件的好處
在項(xiàng)目中,可將一些無(wú)需即時(shí)返回且耗時(shí)的操作提取出來(lái),進(jìn)行異步處理,而這種異步處理的方式大大的節(jié)省了服務(wù)器的請(qǐng)求響應(yīng)時(shí)間,從而提高了系統(tǒng)的吞吐量。
1.2.1 應(yīng)用解耦
在我們的應(yīng)用中,下訂單同時(shí)需要調(diào)用庫(kù)存系統(tǒng)、支付系統(tǒng)等業(yè)務(wù);
隨著業(yè)務(wù)升級(jí),需要更改業(yè)務(wù)需求,在下訂單的同時(shí)需要對(duì)接積分系統(tǒng)進(jìn)行加積分操作,因此結(jié)果變?yōu)槿缦拢?/p>
從上圖的演變我們可以知道,隨著業(yè)務(wù)的不斷升級(jí),業(yè)務(wù)的不多增加,我們可能需要頻繁的修改訂單系統(tǒng)的代碼,現(xiàn)在我們的訂單系統(tǒng)嚴(yán)重和其他系統(tǒng)耦合在一起了,可維護(hù)差;不僅如此,當(dāng)訂單系統(tǒng)調(diào)用庫(kù)存系統(tǒng)時(shí),如果庫(kù)存系統(tǒng)不能夠及時(shí)響應(yīng),那么必定會(huì)造成訂單系統(tǒng)的延遲,或者庫(kù)存系統(tǒng)出現(xiàn)錯(cuò)誤,那么也很有可能導(dǎo)致訂單系統(tǒng)出現(xiàn)故障,系統(tǒng)的容錯(cuò)性非常低;
為了解決上述問(wèn)題,我們引入了消息中間件(MQ):
當(dāng)訂單系統(tǒng)需要對(duì)接其他系統(tǒng)時(shí),只需要發(fā)消息給MQ,由MQ來(lái)通知其他系統(tǒng)進(jìn)行業(yè)務(wù)操作,訂單系統(tǒng)只與MQ進(jìn)行對(duì)接,從而解決我們上面的幾個(gè)問(wèn)題;
-
1、業(yè)務(wù)耦合
-
2、系統(tǒng)延遲
-
3、容錯(cuò)性低
1.2.2 異步處理
在我們沒(méi)有引入MQ之前的老系統(tǒng)中,調(diào)用訂單系統(tǒng),等待訂單系統(tǒng)處理完業(yè)務(wù)邏輯之后響應(yīng)客戶端大概需要時(shí)間:200ms+200ms+200ms=600ms
引入了MQ隊(duì)列之后只需要5ms!
這里說(shuō)明一點(diǎn):我們之前講MQ概述時(shí)已經(jīng)講過(guò),MQ適用于一些無(wú)需即時(shí)返回且耗時(shí)的操作,假設(shè)在上述架構(gòu)中,訂單系統(tǒng)需要庫(kù)存系統(tǒng)返回某值后才能進(jìn)行下一步操作則不適用于MQ;
1.2.3 流量削峰
流量削峰指的是在應(yīng)用服務(wù)器面對(duì)大流量訪問(wèn)時(shí),MQ可以幫助我們進(jìn)行流量的限流操作,削弱流量,保證服務(wù)器的正常運(yùn)行;
假設(shè)現(xiàn)在某電商網(wǎng)站搞促銷活動(dòng),導(dǎo)致流量迅速激增,已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)應(yīng)用服務(wù)器的壓力承受范圍,此時(shí)如果不進(jìn)行流量(QPS)的控制,那么應(yīng)用服務(wù)器很有可能會(huì)出現(xiàn)故障:
為了防止過(guò)度的流量同時(shí)進(jìn)入我們的應(yīng)用服務(wù)器,導(dǎo)致應(yīng)用服務(wù)器最終宕機(jī),我們可以進(jìn)行限流手段,即每秒從MQ中拉取1000個(gè)請(qǐng)求進(jìn)行處理:
由于高并發(fā)的訪問(wèn),消息會(huì)被擠壓在MQ中,在高峰期過(guò)后,仍有一段時(shí)間內(nèi)消息消費(fèi)的速度維護(hù)在1000/s,直到積壓的消息全部被消費(fèi)完畢;
1.3 消息中間件帶來(lái)的問(wèn)題
1.3.1 消息一致性
如上圖,如果訂單系統(tǒng)給其他系統(tǒng)發(fā)送完畢消息后,某個(gè)系統(tǒng)處理失敗,該如何保證數(shù)據(jù)的一致性?
1.3.2 消息重復(fù)消費(fèi)(消息冪等性)
當(dāng)我們一個(gè)接口多次消費(fèi)一個(gè)消息時(shí),我們需要保證這個(gè)操作無(wú)論被操作多少次其結(jié)果是一樣的,這個(gè)時(shí)候我們就需要保證接口的冪等性;
冪等:一個(gè)操作任意執(zhí)行多次與執(zhí)行一次的結(jié)果是相同的
在上述系統(tǒng)中,如果執(zhí)行庫(kù)存系統(tǒng)出現(xiàn)問(wèn)題,那么訂單系統(tǒng)會(huì)重發(fā)消息,但是支付和積分系統(tǒng)是沒(méi)有任何問(wèn)題的,但由于消息的重發(fā),導(dǎo)致支付和積分系統(tǒng)再次消費(fèi)一次消息;
1.3.3 成本問(wèn)題
- 系統(tǒng)可用性降低
系統(tǒng)引入的外部依賴越多,系統(tǒng)穩(wěn)定性越差。一旦 MQ 宕機(jī),就會(huì)對(duì)業(yè)務(wù)造成影響。如何保證MQ的高可用?
- 系統(tǒng)復(fù)雜度提高
MQ 的加入大大增加了系統(tǒng)的復(fù)雜度,以前系統(tǒng)間是同步的遠(yuǎn)程調(diào)用,現(xiàn)在是通過(guò) MQ 進(jìn)行異步調(diào)用。需要保證MQ帶來(lái)的一系列問(wèn)題文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-412118.html
1.3 常見(jiàn)MQ性能對(duì)比
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
公司/社區(qū) | Rabbit | Apache | 阿里 | Apache |
開(kāi)發(fā)語(yǔ)言 | Erlang | Java | Java | Scala&Java |
協(xié)議支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定義 | 自定義協(xié)議,社區(qū)封裝了http協(xié)議支持 |
客戶端支持語(yǔ)言 | 官方支持Erlang,Java,Ruby等,社區(qū)產(chǎn)出多種API,幾乎支持所有語(yǔ)言 | Java,C,C++,Python,PHP,Perl,.net等 | Java,C++(不成熟) | 官方支持Java,社區(qū)產(chǎn)出多種API,如PHP,Python等 |
單機(jī)吞吐量 | 萬(wàn)級(jí)(其次) | 萬(wàn)級(jí)(最差) | 十萬(wàn)級(jí)(最好) | 十萬(wàn)級(jí)(次之) |
消息延遲 | 微秒級(jí) | 毫秒級(jí) | 毫秒級(jí) | 毫秒以內(nèi) |
功能特性 | 并發(fā)能力強(qiáng),性能極其好,延時(shí)低,社區(qū)活躍,管理界面豐富 | 老牌產(chǎn)品,成熟度高,文檔較多 | MQ功能比較完備,擴(kuò)展性佳 | 只支持主要的MQ功能,畢竟是為大數(shù)據(jù)領(lǐng)域準(zhǔn)備的。 |
1.4 AMQP和JMS
- AMQP:即Advanced Message Queuing Protocol,一個(gè)提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議,進(jìn)程間傳遞異步消息的網(wǎng)絡(luò)協(xié)議。為面向消息的中間件設(shè)計(jì)?;诖藚f(xié)議的客戶端與消息中間件可傳遞消息,并不受客戶端中間件不同產(chǎn)品的限制,不同的開(kāi)發(fā)語(yǔ)言等條件的限制。Erlang中的實(shí)現(xiàn)有RabbitMQ等。
- JMS:JMS即Java消息服務(wù)(Java Message Service)應(yīng)用程序接口,是一個(gè)Java平臺(tái)中關(guān)于面向消息中間件(MOM)的API,用于在兩個(gè)應(yīng)用程序之間,或分布式系統(tǒng)中發(fā)送消息,進(jìn)行異步通信。Java消息服務(wù)是一個(gè)與具體平臺(tái)無(wú)關(guān)的API,絕大多數(shù)消息中間件提供商都對(duì)JMS提供支持。
AMQP是基于消息傳輸?shù)囊粋€(gè)應(yīng)用層協(xié)議,JMS準(zhǔn)確的來(lái)說(shuō)是Java操作MQ的一套API,類似于JDBC,第三方廠商(MySQL廠商、MQ廠商)進(jìn)行功能的實(shí)現(xiàn),Java則使用JMS對(duì)廠商進(jìn)行規(guī)范;文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-412118.html
到了這里,關(guān)于面試官:MQ的好處到底有哪些?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!