什么是消息隊(duì)列
消息隊(duì)列(Message Queue,簡(jiǎn)稱(chēng)MQ)犀忱,指保存消息的一個(gè)容器募谎,本質(zhì)是個(gè)隊(duì)列。
消息(Message)是指在應(yīng)用之間傳送的數(shù)據(jù)阴汇,消息可以非常簡(jiǎn)單数冬,比如只包含文本字符串,也可以更復(fù)雜搀庶,可能包含嵌入對(duì)象拐纱。
消息隊(duì)列(Message Queue)是一種應(yīng)用間的通信方式,消息發(fā)送后可以立即返回哥倔,有消息系統(tǒng)來(lái)確保信息的可靠專(zhuān)遞秸架,消息發(fā)布者只管把消息發(fā)布到MQ中而不管誰(shuí)來(lái)取,消息使用者只管從MQ中取消息而不管誰(shuí)發(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)然近年來(lái)火熱的Kafka,從某些場(chǎng)景來(lái)說(shuō)艘刚,也是MQ管宵,當(dāng)然kafka的功能更加強(qiáng)大截珍。
雖然不同的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)境下事期,由于來(lái)不及同步處理滥壕,通過(guò)使用消息隊(duì)列,可以異步處理請(qǐng)求兽泣,從而緩解系統(tǒng)的壓力绎橘。
舉一個(gè)訂單系統(tǒng)的例子:用戶(hù)點(diǎn)擊下訂單,會(huì)觸發(fā)以下業(yè)務(wù)邏輯流程:
- 扣減庫(kù)存
- 生成相應(yīng)的訂單
- 發(fā)短信通知等等
在業(yè)務(wù)發(fā)展初期這些邏輯可能放在一起同步執(zhí)行唠倦,隨著業(yè)務(wù)訂單量增長(zhǎng)称鳞,需要提升系統(tǒng)服務(wù)的性能,這時(shí)候可以將一些不需要立即生效的操作拆分出來(lái)異步執(zhí)行稠鼻,比如發(fā)短信通知等冈止,這種場(chǎng)景就可以使用消息隊(duì)列MQ。
本質(zhì)還是通過(guò)異步來(lái)解決同步的系統(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匠楚、解耦:防止引入過(guò)多的API給系統(tǒng)的穩(wěn)定性帶來(lái)風(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ā)送者無(wú)需與接收者建立連接食寡,雙方通過(guò)消息隊(duì)列保證消息能夠從發(fā)送者路由到接收者,甚至對(duì)于本來(lái)網(wǎng)絡(luò)不易互通的兩個(gè)服務(wù)廓潜,也可以提供消息路由抵皱。
消息隊(duì)列的特點(diǎn)
1.異步性
將耗時(shí)的同步操作善榛,通過(guò)以發(fā)送消息的方式,進(jìn)行了異步化處理呻畸。減少了同步等待的時(shí)間移盆。
2.松耦合
消息隊(duì)列減少了服務(wù)之間的耦合性,不同的服務(wù)可以通過(guò)消息隊(duì)列進(jìn)行通信伤为,而不用關(guān)心彼此的實(shí)現(xiàn)細(xì)節(jié)味滞,只要定義好消息的格式就行。
3.分布式
通過(guò)對(duì)消費(fèi)者的橫向擴(kuò)展钮呀,降低了消息隊(duì)列阻塞的風(fēng)險(xiǎn)剑鞍,以及單個(gè)消費(fèi)者產(chǎn)生單點(diǎn)故障的可能性(當(dāng)然消息隊(duì)列本身也可以做成分布式集群)。
4.可靠性
消息隊(duì)列一般會(huì)把接收到的消息存儲(chǔ)到本地硬盤(pán)上(當(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語(yǔ)言開(kāi)發(fā)跷睦,結(jié)合erlang語(yǔ)言本身的并發(fā)優(yōu)勢(shì)筷弦,支持很多的協(xié)議:AMQP,XMPP, SMTP, STOMP抑诸,也正是如此烂琴,使的它變的非常重量級(jí),更適合于企業(yè)級(jí)的開(kāi)發(fā)蜕乡。性能較好奸绷,但是不利于做二次開(kāi)發(fā)和維護(hù)。
3.RocketMQ
阿里開(kāi)源的消息中間件层玲,純Java開(kāi)發(fā)号醉,具有高吞吐量、高可用性辛块、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)畔派。
4.ZeroMQ
號(hào)稱(chēng)最快的消息隊(duì)列系統(tǒng),尤其針對(duì)大吞吐量的需求場(chǎng)景憨降。
擴(kuò)展性好父虑,開(kāi)發(fā)比較靈活该酗,采用C語(yǔ)言實(shí)現(xiàn)授药,實(shí)際上只是一個(gè)socket庫(kù)的重新封裝士嚎,如果做為消息隊(duì)列使用,需要開(kāi)發(fā)大量的代碼悔叽。
5.Kafka
Kafka是Apache下的一個(gè)子項(xiàng)目莱衩,是一個(gè)高性能跨語(yǔ)言分布式發(fā)布/訂閱消息隊(duì)列系統(tǒng),而Jafka是在Kafka之上孵化而來(lái)的娇澎,即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ú)立自主尤筐,只通過(guò)消息隊(duì)列MQ來(lái)聯(lián)系邑贴。
舉一個(gè)例子:用戶(hù)下訂單流程,下訂單后會(huì)發(fā)生扣庫(kù)存這個(gè)動(dòng)作叔磷,上游系統(tǒng)訂單和下游系統(tǒng)扣庫(kù)存拢驾,就可以通過(guò)上圖的消息隊(duì)列MQ來(lái)聯(lián)系,扣庫(kù)存異步化改基,從而實(shí)現(xiàn)訂單系統(tǒng)與庫(kù)存系統(tǒng)的應(yīng)用解耦繁疤。
3.流量削鋒
流量削鋒也是消息隊(duì)列中的常用場(chǎng)景,一般在秒殺或團(tuán)搶活動(dòng)中使用廣泛秕狰。
應(yīng)用場(chǎng)景:秒殺活動(dòng)稠腊,一般會(huì)因?yàn)榱髁窟^(guò)大,導(dǎo)致流量暴增鸣哀,應(yīng)用掛掉架忌。為解決這個(gè)問(wèn)題,一般需要在應(yīng)用前端加入消息隊(duì)列我衬。
4日志處理
日志處理是指將消息隊(duì)列用在日志處理中叹放,比如Kafka的應(yīng)用饰恕,解決大量日志傳輸?shù)膯?wèn)題。
5消息通訊
消息隊(duì)列一般都內(nèi)置了高效的通信機(jī)制井仰,因此也可以用于單純的消息通訊埋嵌,比如實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)消息隊(duì)列或者聊天室等。
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布俱恶!