【选型】消息中间件选型
目錄
一、概述? ?
? ? ? ?什么是消息中間件?
二、消息隊(duì)列的使用場(chǎng)景??
? ? ? ?為什么使用消息隊(duì)列?
? ? ? ?消息隊(duì)列有什么優(yōu)缺點(diǎn)?
三、目前流行的消息隊(duì)列優(yōu)缺點(diǎn)對(duì)比
四、總結(jié)??? ?
?
?
一、概述? ?
? ? ? ?什么是消息中間件?
消息隊(duì)列中間件(簡稱消息中間件)是指利用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。通過提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下提供應(yīng)用解耦、彈性伸縮、冗余存儲(chǔ)、流量削峰、異步通信、數(shù)據(jù)同步等等功能,其作為分布式系統(tǒng)架構(gòu)中的一個(gè)重要組件,有著舉足輕重的地位。個(gè)人感覺比價(jià)場(chǎng)景應(yīng)用核心的有三個(gè):解耦、異步、削峰。
?
二、消息隊(duì)列的使用場(chǎng)景??
? ? ? ?為什么使用消息隊(duì)列?
其實(shí)這個(gè)話題也是面試官經(jīng)常問詢的問題,問問你消息隊(duì)列都有哪些使用場(chǎng)景,然后你項(xiàng)目里具體是什么場(chǎng)景,說說你在這個(gè)場(chǎng)景里用消息隊(duì)列是什么
期望的一個(gè)回答是說,你們公司有個(gè)什么業(yè)務(wù)場(chǎng)景,這個(gè)業(yè)務(wù)場(chǎng)景有個(gè)什么技術(shù)挑戰(zhàn),如果不用MQ可能會(huì)很麻煩,但是你現(xiàn)在用了MQ之后帶給了你很多的好處
現(xiàn)在你可以下想想你如何回答上述問題,想不起來?? 好吧我這里先介紹幾個(gè)常見使用場(chǎng)景,提醒下。。。
解耦:現(xiàn)場(chǎng)畫個(gè)圖來說明一下,
?
A系統(tǒng)發(fā)送個(gè)數(shù)據(jù)到BCD三個(gè)系統(tǒng),接口調(diào)用發(fā)送,那如果E系統(tǒng)也要這個(gè)數(shù)據(jù)呢?那如果C系統(tǒng)現(xiàn)在不需要了呢?現(xiàn)在A系統(tǒng)又要發(fā)送第二種數(shù)據(jù)了呢?A系統(tǒng)負(fù)責(zé)人瀕臨崩潰中。。。再來點(diǎn)更加崩潰的事兒,A系統(tǒng)要時(shí)時(shí)刻刻考慮BCDE四個(gè)系統(tǒng)如果掛了咋辦?我要不要重發(fā)?我要不要把消息存起來?頭發(fā)都白了啊。。。
?
?
這是你需要去考慮一下你負(fù)責(zé)的系統(tǒng)中是否有類似的場(chǎng)景,就是一個(gè)系統(tǒng)或者一個(gè)模塊,調(diào)用了多個(gè)系統(tǒng)或者模塊,互相之間的調(diào)用很復(fù)雜,維護(hù)起來很麻煩。但是其實(shí)這個(gè)調(diào)用是不需要直接同步調(diào)用接口的,如果用MQ給他異步化解耦,也是可以的,你就需要去考慮在你的項(xiàng)目里(做過微服務(wù)項(xiàng)目的同學(xué)這里是不是考慮下? 消息總線 搭配Rabbitmq 做解耦 用于廣播配置文件的更改或者服務(wù)間的通訊?),是不是可以運(yùn)用這個(gè)MQ去進(jìn)行系統(tǒng)的解耦。在簡歷中體現(xiàn)出來這塊東西,用MQ作解耦。
異步:現(xiàn)場(chǎng)畫個(gè)圖來說明一下,
?
?
A系統(tǒng)接收一個(gè)請(qǐng)求,需要在自己本地寫庫,還需要在BCD三個(gè)系統(tǒng)寫庫,自己本地寫庫要3ms,BCD三個(gè)系統(tǒng)分別寫庫要300ms、450ms、200ms。最終請(qǐng)求總延時(shí)是3 + 300 + 450 + 200 = 953ms,接近1s,用戶感覺搞個(gè)什么東西,慢死了慢死了。
更改為 異步后當(dāng)消息發(fā)送到消息隊(duì)列? 自行讓對(duì)應(yīng)系統(tǒng)進(jìn)行消費(fèi)即可? 所以給用戶的體驗(yàn)為20 + 5 = 25ms? ,快 好快!
削峰:每天0點(diǎn)到11點(diǎn),A系統(tǒng)風(fēng)平浪靜,每秒并發(fā)請(qǐng)求數(shù)量就100個(gè)。結(jié)果每次一到11點(diǎn)~1點(diǎn),每秒并發(fā)請(qǐng)求數(shù)量突然會(huì)暴增到1萬條。但是系統(tǒng)最大的處理能力就只能是每秒鐘處理1000個(gè)請(qǐng)求啊。。。尷尬了,系統(tǒng)會(huì)死。。。
?
?
?
?
?消息隊(duì)列有什么優(yōu)缺點(diǎn)?
優(yōu)點(diǎn)上面已經(jīng)說了,就是在特殊場(chǎng)景下有其對(duì)應(yīng)的好處,解耦、異步、削峰
?
缺點(diǎn)呢?顯而易見的
?
?
?
系統(tǒng)可用性降低:系統(tǒng)引入的外部依賴越多,越容易掛掉,本來你就是A系統(tǒng)調(diào)用BCD三個(gè)系統(tǒng)的接口就好了,人ABCD四個(gè)系統(tǒng)好好的,沒啥問題,你偏加個(gè)MQ進(jìn)來,萬一MQ掛了咋整?MQ掛了,整套系統(tǒng)崩潰了,你不就完了么。
?
系統(tǒng)復(fù)雜性提高:硬生生加個(gè)MQ進(jìn)來,你怎么保證消息沒有重復(fù)消費(fèi)?怎么處理消息丟失的情況?怎么保證消息傳遞的順序性?頭大頭大,問題一大堆,痛苦不已
?
一致性問題:A系統(tǒng)處理完了直接返回成功了,人都以為你這個(gè)請(qǐng)求就成功了;但是問題是,要是BCD三個(gè)系統(tǒng)那里,BD兩個(gè)系統(tǒng)寫庫成功了,結(jié)果C系統(tǒng)寫庫失敗了,咋整?你這數(shù)據(jù)就不一致了。
?
所以消息隊(duì)列實(shí)際是一種非常復(fù)雜的架構(gòu),你引入它有很多好處,但是也得針對(duì)它帶來的壞處做各種額外的技術(shù)方案和架構(gòu)來規(guī)避掉,最好之后,你會(huì)發(fā)現(xiàn),媽呀,系統(tǒng)復(fù)雜度提升了一個(gè)數(shù)量級(jí),也許是復(fù)雜了10倍。但是關(guān)鍵時(shí)刻,用,還是得用的。。。
目前流行的消息隊(duì)列優(yōu)缺點(diǎn)對(duì)比
kafka、activemq、rabbitmq、rocketmq都有什么優(yōu)點(diǎn)和缺點(diǎn)啊?
常見的MQ其實(shí)就這幾種,別的還有很多其他MQ,但是比較冷門的,那么就別多說了
作為一個(gè)碼農(nóng),你起碼得知道各種mq的優(yōu)點(diǎn)和缺點(diǎn)吧,咱們來畫個(gè)表格看看
?
?
綜上所述,各種對(duì)比之后,總結(jié)如下:
一般的業(yè)務(wù)系統(tǒng)要引入MQ,最早大家都用ActiveMQ,但是現(xiàn)在確實(shí)大家用的不多了,沒經(jīng)過大規(guī)模吞吐量場(chǎng)景的驗(yàn)證,社區(qū)也不是很活躍,所以大家還是算了吧,我個(gè)人不推薦用這個(gè)了;
后來大家開始用RabbitMQ,但是確實(shí)erlang語言阻止了大量的java工程師去深入研究和掌控他,對(duì)公司而言,幾乎處于不可控的狀態(tài),但是確實(shí)人是開源的,比較穩(wěn)定的支持,活躍度也高;
不過現(xiàn)在確實(shí)越來越多的公司,會(huì)去用RocketMQ,確實(shí)很不錯(cuò),但是我提醒一下自己想好社區(qū)萬一突然黃掉的風(fēng)險(xiǎn),對(duì)自己公司技術(shù)實(shí)力有絕對(duì)自信的,我推薦用RocketMQ,否則回去老老實(shí)實(shí)用RabbitMQ吧,人是活躍開源社區(qū),絕對(duì)不會(huì)黃
所以中小型公司,技術(shù)實(shí)力較為一般,技術(shù)挑戰(zhàn)不是特別高,用RabbitMQ是不錯(cuò)的選擇(我們項(xiàng)目也正在使用這個(gè)^_^);大型公司,基礎(chǔ)架構(gòu)研發(fā)實(shí)力較強(qiáng),用RocketMQ是很好的選擇
如果是大數(shù)據(jù)領(lǐng)域的實(shí)時(shí)計(jì)算、日志采集等場(chǎng)景,用Kafka是業(yè)內(nèi)標(biāo)準(zhǔn)的,絕對(duì)沒問題,社區(qū)活躍度很高,絕對(duì)不會(huì)黃,何況幾乎是全世界這個(gè)領(lǐng)域的事實(shí)性規(guī)范
轉(zhuǎn)自:https://blog.csdn.net/java_zyq/article/details/80022391
轉(zhuǎn)載于:https://www.cnblogs.com/itplay/p/10642533.html
總結(jié)
以上是生活随笔為你收集整理的【选型】消息中间件选型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: session and cookie
- 下一篇: vue 创建项目的命令