什么是消息隊(duì)列
消息隊(duì)列(Message Queue临谱,簡(jiǎn)稱MQ),指保存消息的一個(gè)容器奴璃,本質(zhì)是個(gè)隊(duì)列悉默。
消息(Message)是指在應(yīng)用之間傳送的數(shù)據(jù),消息可以非常簡(jiǎn)單苟穆,比如只包含文本字符串麦牺,也可以更復(fù)雜,可能包含嵌入對(duì)象鞭缭。
消息隊(duì)列(Message Queue)是一種應(yīng)用間的通信方式剖膳,消息發(fā)送后可以立即返回,有消息系統(tǒng)來確保信息的可靠專遞岭辣,消息發(fā)布者只管把消息發(fā)布到MQ中而不管誰來取吱晒,消息使用者只管從MQ中取消息而不管誰發(fā)布的,這樣發(fā)布者和使用者都不用知道對(duì)方的存在沦童。
?Producer:消息生產(chǎn)者仑濒,負(fù)責(zé)產(chǎn)生和發(fā)送消息到 Broker;
?Broker:消息處理中心偷遗。負(fù)責(zé)消息存儲(chǔ)墩瞳、確認(rèn)、重試等氏豌,一般其中會(huì)包含多個(gè) queue喉酌;
?Consumer:消息消費(fèi)者,負(fù)責(zé)從 Broker 中獲取消息泵喘,并進(jìn)行相應(yīng)處理泪电;
現(xiàn)在常用的MQ組件有ActiveMQ、RabbitMQ纪铺、RocketMQ相速、ZeroMQ,當(dāng)然近年來火熱的Kafka,從某些場(chǎng)景來說,也是MQ鲜锚,當(dāng)然kafka的功能更加強(qiáng)大突诬∩慌模【加群】:857565362
雖然不同的MQ都有自己的特點(diǎn)和優(yōu)勢(shì),但是旺隙,不管是哪種MQ绒极,都有MQ本身自帶的一些特點(diǎn),下面催束,咱們談?wù)勏㈥?duì)列的的特點(diǎn)集峦、優(yōu)勢(shì)、選型抠刺、以及應(yīng)用場(chǎng)景塔淤。
為什么需要消息隊(duì)列
在高并發(fā)分布式環(huán)境下,由于來不及同步處理速妖,通過使用消息隊(duì)列高蜂,可以異步處理請(qǐng)求,從而緩解系統(tǒng)的壓力罕容。
舉一個(gè)訂單系統(tǒng)的例子:用戶點(diǎn)擊下訂單备恤,會(huì)觸發(fā)以下業(yè)務(wù)邏輯流程:
?扣減庫存
?生成相應(yīng)的訂單
?發(fā)短信通知等等
在業(yè)務(wù)發(fā)展初期這些邏輯可能放在一起同步執(zhí)行,隨著業(yè)務(wù)訂單量增長(zhǎng)锦秒,需要提升系統(tǒng)服務(wù)的性能露泊,這時(shí)候可以將一些不需要立即生效的操作拆分出來異步執(zhí)行,比如發(fā)短信通知等旅择,這種場(chǎng)景就可以使用消息隊(duì)列MQ惭笑。
本質(zhì)還是通過異步來解決同步的系統(tǒng)壓力,所以我們?cè)谧黾軜?gòu)設(shè)計(jì)的時(shí)候有一個(gè)原則:能異步的就盡量不要同步生真。
消息隊(duì)列的優(yōu)點(diǎn)
1沉噩、屏蔽異構(gòu)平臺(tái)的細(xì)節(jié):發(fā)送方、接收方系統(tǒng)之間不需要了解雙方柱蟀,只需認(rèn)識(shí)消息川蒙。
2、異步:消息堆積能力长已;發(fā)送方接收方不需同時(shí)在線畜眨,發(fā)送方接收方不需同時(shí)擴(kuò)容(削峰)。
3痰哨、解耦:防止引入過多的API給系統(tǒng)的穩(wěn)定性帶來風(fēng)險(xiǎn)胶果;調(diào)用方使用不當(dāng)會(huì)給被調(diào)用方系統(tǒng)造成壓力,被調(diào)用方處理不當(dāng)會(huì)降低調(diào)用方系統(tǒng)的響應(yīng)能力斤斧。
4、復(fù)用:一次發(fā)送多次消費(fèi)霎烙。
5撬讽、可靠:一次保證消息的傳遞蕊连。如果發(fā)送消息時(shí)接收者不可用,消息隊(duì)列會(huì)保留消息游昼,直到成功地傳遞它甘苍。
6、提供路由:發(fā)送者無需與接收者建立連接烘豌,雙方通過消息隊(duì)列保證消息能夠從發(fā)送者路由到接收者载庭,甚至對(duì)于本來網(wǎng)絡(luò)不易互通的兩個(gè)服務(wù),也可以提供消息路由廊佩。
消息隊(duì)列的特點(diǎn)
1.異步性
將耗時(shí)的同步操作囚聚,通過以發(fā)送消息的方式,進(jìn)行了異步化處理标锄。減少了同步等待的時(shí)間顽铸。
2.松耦合
消息隊(duì)列減少了服務(wù)之間的耦合性,不同的服務(wù)可以通過消息隊(duì)列進(jìn)行通信料皇,而不用關(guān)心彼此的實(shí)現(xiàn)細(xì)節(jié)谓松,只要定義好消息的格式就行。
3.分布式
通過對(duì)消費(fèi)者的橫向擴(kuò)展践剂,降低了消息隊(duì)列阻塞的風(fēng)險(xiǎn)鬼譬,以及單個(gè)消費(fèi)者產(chǎn)生單點(diǎn)故障的可能性(
當(dāng)然消息隊(duì)列本身也可以做成分布式集群
)。
4.可靠性
消息隊(duì)列一般會(huì)把接收到的消息存儲(chǔ)到本地硬盤上(
當(dāng)消息被處理完之后逊脯,存儲(chǔ)信息根據(jù)不同的消息隊(duì)列實(shí)現(xiàn)优质,有可能將其刪除
),這樣即使應(yīng)用掛掉或者消息隊(duì)列本身掛掉男窟,消息也能夠重新加載盆赤。
消息隊(duì)列的選型
1.ActiveMQ
Apache出品,最早使用的消息隊(duì)列產(chǎn)品歉眷,時(shí)間比較長(zhǎng)了牺六,最近版本更新比較緩慢。
2.RabbitMQ
RabbitMQ是erlang語言開發(fā)汗捡,結(jié)合erlang語言本身的并發(fā)優(yōu)勢(shì)淑际,支持很多的協(xié)議:AMQP,XMPP, SMTP, STOMP扇住,也正是如此春缕,使的它變的非常重量級(jí),更適合于企業(yè)級(jí)的開發(fā)艘蹋。性能較好锄贼,但是不利于做二次開發(fā)和維護(hù)。
3.RocketMQ
阿里開源的消息中間件女阀,純Java開發(fā)宅荤,具有高吞吐量屑迂、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)冯键。
4.ZeroMQ
號(hào)稱最快的消息隊(duì)列系統(tǒng)惹盼,尤其針對(duì)大吞吐量的需求場(chǎng)景。
擴(kuò)展性好惫确,開發(fā)比較靈活手报,采用C語言實(shí)現(xiàn),實(shí)際上只是一個(gè)socket庫的重新封裝改化,如果做為消息隊(duì)列使用掩蛤,需要開發(fā)大量的代碼。
5.Kafka
Kafka是Apache下的一個(gè)子項(xiàng)目所袁,是一個(gè)高性能跨語言分布式發(fā)布/訂閱消息隊(duì)列系統(tǒng)盏档,而Jafka是在Kafka之上孵化而來的,即Kafka的一個(gè)升級(jí)版燥爷。
6.消息隊(duì)列的詳細(xì)比較
7.消息隊(duì)列總結(jié)
消息隊(duì)列的選型需要根據(jù)具體應(yīng)用需求而定蜈亩,ZeroMQ小而美,RabbitMQ大而穩(wěn)前翎,Kakfa和RocketMQ快而強(qiáng)勁稚配。
消息隊(duì)列的應(yīng)用場(chǎng)景
1.異步處理
消息隊(duì)列的主要特點(diǎn)是異步處理,主要目的是減少請(qǐng)求響應(yīng)時(shí)間港华,實(shí)現(xiàn)非核心流程異步化道川,提高系統(tǒng)響應(yīng)性能。
所以典型的使用場(chǎng)景就是將比較耗時(shí)而且不需要即時(shí)(同步)返回結(jié)果的操作立宜,作為消息放入消息隊(duì)列冒萄。
2.應(yīng)用解耦
使用了消息隊(duì)列后,只要保證消息格式不變橙数,消息的發(fā)送方和接收方并不需要彼此聯(lián)系尊流,也不需要受對(duì)方的影響,即解耦灯帮。
每個(gè)成員不必受其他成員影響崖技,可以更獨(dú)立自主,只通過消息隊(duì)列MQ來聯(lián)系钟哥。
舉一個(gè)例子:用戶下訂單流程迎献,下訂單后會(huì)發(fā)生扣庫存這個(gè)動(dòng)作,上游系統(tǒng)訂單和下游系統(tǒng)扣庫存腻贰,就可以通過上圖的消息隊(duì)列MQ來聯(lián)系吁恍,扣庫存異步化,從而實(shí)現(xiàn)訂單系統(tǒng)與庫存系統(tǒng)的應(yīng)用解耦。
3.流量削鋒
流量削鋒也是消息隊(duì)列中的常用場(chǎng)景践盼,一般在秒殺或團(tuán)搶活動(dòng)中使用廣泛鸦采。
應(yīng)用場(chǎng)景:秒殺活動(dòng)宾巍,一般會(huì)因?yàn)榱髁窟^大咕幻,導(dǎo)致流量暴增,應(yīng)用掛掉顶霞。為解決這個(gè)問題肄程,一般需要在應(yīng)用前端加入消息隊(duì)列。
4日志處理
日志處理是指將消息隊(duì)列用在日志處理中选浑,比如Kafka的應(yīng)用蓝厌,解決大量日志傳輸?shù)膯栴}。
5消息通訊
消息隊(duì)列一般都內(nèi)置了高效的通信機(jī)制古徒,因此也可以用于單純的消息通訊拓提,比如實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)消息隊(duì)列或者聊天室等。
我這兒整理了比較全面的JAVA相關(guān)的面試資料隧膘,
需要領(lǐng)取面試資料的同學(xué)代态,請(qǐng)加群:473984645