1. 什么是消息中間件
(1)什么是消息拨脉?
消息是指:在應(yīng)用程序之間傳遞的數(shù)據(jù)或衡。消息可以非常簡單焦影,比如只包含文本字符串、JSON等封断;但也可以很復(fù)雜斯辰,比如一個對象。
(2)什么是消息中間件坡疼?
消息中間件是指:利用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺無關(guān)的數(shù)據(jù)(我們說消息就是數(shù)據(jù)彬呻,所以這里也就是消息)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。
2. 消息中間件的優(yōu)缺點(diǎn)
2.1 優(yōu)點(diǎn)
(1)應(yīng)用解耦
系統(tǒng)的耦合性越高闸氮,容錯性就越低剪况。以電商應(yīng)用為例,用戶創(chuàng)建訂單后蒲跨,如果耦合調(diào)用庫存系統(tǒng)译断、物流系統(tǒng)、支付系統(tǒng)或悲,任何一個子系統(tǒng)出了故障或者因?yàn)樯壍仍驎簳r(shí)不可用孙咪,都會造成下單操作異常,影響用戶使用體驗(yàn)隆箩。
使用消息中間件解耦合该贾,系統(tǒng)的耦合性就提高了。比如物流系統(tǒng)發(fā)生故障捌臊,需要幾分鐘才能來修復(fù)杨蛋,在這段時(shí)間內(nèi),物流系統(tǒng)要處理的數(shù)據(jù)被緩存到消息中間件中理澎,用戶的下單操作正常完成逞力。當(dāng)物流系統(tǒng)恢復(fù)后,補(bǔ)充處理存在消息中間件中的訂單消息即可糠爬,終端系統(tǒng)感知不到物流系統(tǒng)發(fā)生過幾分鐘故障寇荧。
(2)流量削峰
應(yīng)用系統(tǒng)如果遇到系統(tǒng)請求流量的瞬間猛增,有可能會將系統(tǒng)壓垮执隧。有了消息中間件可以將大量請求緩存起來揩抡,分散到很長一段時(shí)間處理,這樣可以大大提到系統(tǒng)的穩(wěn)定性和用戶體驗(yàn)镀琉。
一般情況峦嗤,為了保證系統(tǒng)的穩(wěn)定性,如果系統(tǒng)負(fù)載超過閾值屋摔,就會阻止用戶請求烁设,這會影響用戶體驗(yàn),而如果使用消息中間件將請求緩存起來钓试,等待系統(tǒng)處理完畢后通知用戶下單完畢装黑,這樣比不能下單體驗(yàn)要好。
(3)異步通信
通過消息中間件可以讓數(shù)據(jù)在多個系統(tǒng)更加之間進(jìn)行流通弓熏。數(shù)據(jù)的產(chǎn)生方不需要關(guān)心誰來使用數(shù)據(jù)恋谭,只需要將數(shù)據(jù)發(fā)送到消息中間件,數(shù)據(jù)使用方直接從消息中間件中獲取數(shù)據(jù)即可硝烂。
2.2 缺點(diǎn)
(1)系統(tǒng)可用性降低
系統(tǒng)引入的外部依賴越多箕别,穩(wěn)定性越差铜幽。一旦MQ宕機(jī),就會對業(yè)務(wù)造成影響串稀。這就帶來一個問題:我們?nèi)绾伪WCMQ的高可用除抛?(解決方案:搭建MQ集群)
(2)系統(tǒng)復(fù)雜度提高
MQ的加入雖然降低了應(yīng)用程序之間的耦合性,但也大大增加了系統(tǒng)的復(fù)雜度母截,以前系統(tǒng)間是同步的遠(yuǎn)程調(diào)用到忽,現(xiàn)在是通過MQ進(jìn)行異步調(diào)用。同樣的清寇,這里會帶來幾個問題:如何保證消息沒有被重復(fù)消費(fèi)喘漏?(解決方案:冪等校驗(yàn))怎么保證消息不丟失?(解決方案:消息中間件接收到消息需要給生產(chǎn)者ack回復(fù)华烟;消息中間件需要進(jìn)行消息持久化翩迈;消費(fèi)者手動進(jìn)行ack)如何保證消息的順序性?(解決方案:只能保證在同一隊(duì)列的消息有序性)
(3)一致性問題
使用事務(wù)消息或者配合本地消息表實(shí)現(xiàn)最終一致盔夜。
3. 各個MQ產(chǎn)品的比較
現(xiàn)在市場上常見的MQ產(chǎn)品主要包括:ActiveMQ负饲、RabbitMQ、RocketMQ喂链、kafka返十。每個產(chǎn)品都有自己的優(yōu)缺點(diǎn)以及使用場景,部分特性的比較如下:
特性 | ActiveMQ | RabbitMQ | RocketMQ | kafka |
---|---|---|---|---|
開發(fā)語言 | java | erlang | java | scala |
單機(jī)吞吐量 | 萬級 | 萬級 | 十萬級 | 十萬級 |
時(shí)效性 | ms級 | us級 | ms級 | ms級 |
可用性 | 高(主從架構(gòu)) | 高(主從架構(gòu)) | 非常高(分布式架構(gòu)) | 非常高(分布式架構(gòu)) |
功能特性 | 成熟的產(chǎn)品椭微,在很多公司得到應(yīng)用洞坑;有較多的文檔;支持各種協(xié)議蝇率。 | 基于erlang開發(fā)迟杂,并發(fā)能力很強(qiáng),性能極其好本慕,延時(shí)較低逢慌;有非常完善和豐富的管理界面。 | MQ功能比較完善间狂,擴(kuò)展性好。 | 適用于大數(shù)據(jù)領(lǐng)域應(yīng)用火架。 |