MQ(Messgae Queue)
什么是MQ
MQ全稱為Message Queue,即消息隊列,消息隊列是應(yīng)用程序與應(yīng)用程序之間通信的一致方法,即在消息的傳輸過程中保存消息的容器,多用于分布式系統(tǒng)之間的通信
分布式系統(tǒng)通信的兩種方式
直接遠程調(diào)用
借助第三方完成間接通信
發(fā)送方稱為生產(chǎn)者
接收方稱為消費者
MQ的優(yōu)勢
應(yīng)用解耦
異步提速
削峰填谷
應(yīng)用解耦
MQ相當(dāng)于一個中介,生產(chǎn)方通過MQ與消費方交互泳唠,它將應(yīng)用程序進行解耦合。
未使用MQ之前
如下圖有一個訂單系統(tǒng)直接調(diào)用庫存系統(tǒng)卿操,支付系統(tǒng)警检,物流系統(tǒng)
由于訂單系統(tǒng)與庫存系統(tǒng)是耦合的,如果庫存系統(tǒng)出現(xiàn)了錯誤害淤,可能也會影響訂單系統(tǒng)不能工作
如果要新接入一個系統(tǒng)我們還要改變訂單系統(tǒng)的源碼扇雕,并添加一系列代碼來實現(xiàn)調(diào)用
這就暴露了一個巨大的缺點,系統(tǒng)的耦合性越高窥摄,容錯性就越低镶奉,可維護性就越低
使用MQ之后
訂單系統(tǒng)只要將對應(yīng)的數(shù)據(jù)發(fā)送到MQ即可,而庫存系統(tǒng),支付系統(tǒng)哨苛,物流系統(tǒng)只需MQ中取出對應(yīng)的數(shù)據(jù)即可
如果庫存系統(tǒng)出現(xiàn)了錯誤鸽凶,也不會影響到訂單系統(tǒng),比如庫存系統(tǒng)由于訪問量過大突然卡了幾秒鐘建峭,幾秒鐘之后可能就好了玻侥,好了之后再到MQ中取出對應(yīng)的數(shù)據(jù)即可
比如我們要接入一個系統(tǒng),我們不需要再修改訂單系統(tǒng)的源碼亿蒸,直接讓該系統(tǒng)去MQ中取出對應(yīng)的數(shù)據(jù)即可
小總結(jié):
使用MQ使得應(yīng)用之間實現(xiàn)了解耦凑兰,提升容錯性與可維護性
異步提速
將不需要同步處理的并且耗時長的操作由消息隊列通知消息接收方進行異步處理。提高了應(yīng)用程序的響應(yīng)時間边锁。
未使用MQ
有一個訂單系統(tǒng)如圖
用戶下訂單一共需要300+300+300+20=920ms姑食,訂單系統(tǒng)需要一一調(diào)用數(shù)據(jù)庫,庫存茅坛,支付音半,物流系統(tǒng),耗時極大
使用MQ之后
用戶下訂單需要20+5=25ms
用戶下單后贡蓖,訂單系統(tǒng)只需要進行數(shù)據(jù)庫查詢和將數(shù)據(jù)發(fā)送到MQ即可告訴用戶下單成功曹鸠,剩下的只需讓庫存,支付摩梧,物流系統(tǒng)自行去MQ中取出數(shù)據(jù)即可
小總結(jié)
提升了用戶體驗與系統(tǒng)吞吐量
削峰填谷
未使用MQ前
有如下一個系統(tǒng)A每秒最多能處理1000個請求
但是當(dāng)請求忽然增加大于了A系統(tǒng)能處理的最大請求數(shù)之后就會導(dǎo)致A系統(tǒng)崩潰
使用MQ之后
如訂單系統(tǒng)物延,在下單的時候就會往數(shù)據(jù)庫寫數(shù)據(jù)。但是數(shù)據(jù)庫只能支撐每秒1000左右的并發(fā)寫入仅父,并發(fā)量再高就容易宕機。低峰期的時候并發(fā)也就100多個浑吟,但是在高峰期時候笙纤,并發(fā)量會突然激增到5000以上,這個時候數(shù)據(jù)庫肯定卡死了组力。
消息被MQ保存起來了省容,然后系統(tǒng)就可以按照自己的消費能力來消費,比如每秒1000個數(shù)據(jù)燎字,這樣慢慢寫入數(shù)據(jù)庫腥椒,這樣就不會卡死數(shù)據(jù)庫了。
但是使用了MQ之后候衍,限制消費消息的速度為1000笼蛛,但是這樣一來,高峰期產(chǎn)生的數(shù)據(jù)勢必會被積壓在MQ中蛉鹿,高峰就被“削”掉了滨砍。但是因為消息積壓,在高峰期過后的一段時間內(nèi),消費消息的速度還是會維持在1000QPS惋戏,直到消費完積壓的消息,這就叫做“填谷”
小結(jié)
應(yīng)用解耦:提高系統(tǒng)容錯性與可維護性
異步提速:提升用戶體驗和系統(tǒng)吞吐量
削峰填谷:提高系統(tǒng)穩(wěn)定性
MQ的劣勢
系統(tǒng)可用性降低
系統(tǒng)的復(fù)雜性度提高
一致性問題
系統(tǒng)可用性降低
系統(tǒng)引入的外部依賴越多领追,穩(wěn)定性越差,一旦MQ掛機响逢,就會對業(yè)務(wù)造成影響绒窑,需要保證MQ的高可用
系統(tǒng)的復(fù)雜性度提高
MQ的加入大大增加了系統(tǒng)的復(fù)雜度,以前系統(tǒng)之間是同步的遠程調(diào)用舔亭,現(xiàn)在是通過MQ的異步調(diào)用些膨,如何保證消息沒有重復(fù)消費?如何處理消息丟失的情況分歇?如何保證消息的一致性問題
一致性問題
A系統(tǒng)處理完業(yè)務(wù)傀蓉,通過MQ給B,C,D三個系統(tǒng)發(fā)消息數(shù)據(jù)职抡,如果B系統(tǒng)葬燎,C系統(tǒng)處理成功,D系統(tǒng)處理失敗。如何保證數(shù)據(jù)處理的一致性
什么時候使用MQ
1.生產(chǎn)者不需要從消費者處獲得反饋缚甩,引入消息隊列之前的調(diào)用谱净,其接口返回值因該為空,這才讓異步成為了可能
2.容許短暫性的不一致
3.確實是用了可以提升系統(tǒng)穩(wěn)定性等等擅威,即解耦壕探,提速,削峰這些方面帶來的收益郊丛,超過了MQ李请,管理MQ這些成本
常見的MQ產(chǎn)品
目前業(yè)界有很多MQ產(chǎn)品,例如RabbitMQ厉熟,RocketMQ, ActiveMQ, ZeroMQ, MetaMQ , 也有直接使用Redis充當(dāng)消息隊列的导盅,而這些消息隊列產(chǎn)品,在實際選型時揍瑟,需要結(jié)合自身需求與產(chǎn)品特征綜合考慮