RabbitMQ系列1 什么是MQ
MQ(Messgae Queue)
什么是MQ
MQ全稱為Message Queue,即消息隊(duì)列,消息隊(duì)列是應(yīng)用程序與應(yīng)用程序之間通信的一致方法,即在消息的傳輸過程中保存消息的容器,多用于分布式系統(tǒng)之間的通信
分布式系統(tǒng)通信的兩種方式
直接遠(yuǎn)程調(diào)用
借助第三方完成間接通信
發(fā)送方稱為生產(chǎn)者
接收方稱為消費(fèi)者
MQ的優(yōu)勢(shì)
應(yīng)用解耦
異步提速
削峰填谷
應(yīng)用解耦
MQ相當(dāng)于一個(gè)中介,生產(chǎn)方通過MQ與消費(fèi)方交互,它將應(yīng)用程序進(jìn)行解耦合。
未使用MQ之前
如下圖有一個(gè)訂單系統(tǒng)直接調(diào)用庫存系統(tǒng),支付系統(tǒng),物流系統(tǒng)
由于訂單系統(tǒng)與庫存系統(tǒng)是耦合的,如果庫存系統(tǒng)出現(xiàn)了錯(cuò)誤,可能也會(huì)影響訂單系統(tǒng)不能工作
如果要新接入一個(gè)系統(tǒng)我們還要改變訂單系統(tǒng)的源碼,并添加一系列代碼來實(shí)現(xiàn)調(diào)用
這就暴露了一個(gè)巨大的缺點(diǎn),系統(tǒng)的耦合性越高,容錯(cuò)性就越低,可維護(hù)性就越低
使用MQ之后
訂單系統(tǒng)只要將對(duì)應(yīng)的數(shù)據(jù)發(fā)送到MQ即可,而庫存系統(tǒng),支付系統(tǒng),物流系統(tǒng)只需MQ中取出對(duì)應(yīng)的數(shù)據(jù)即可
如果庫存系統(tǒng)出現(xiàn)了錯(cuò)誤,也不會(huì)影響到訂單系統(tǒng),比如庫存系統(tǒng)由于訪問量過大突然卡了幾秒鐘,幾秒鐘之后可能就好了,好了之后再到MQ中取出對(duì)應(yīng)的數(shù)據(jù)即可
比如我們要接入一個(gè)系統(tǒng),我們不需要再修改訂單系統(tǒng)的源碼,直接讓該系統(tǒng)去MQ中取出對(duì)應(yīng)的數(shù)據(jù)即可
小總結(jié):
使用MQ使得應(yīng)用之間實(shí)現(xiàn)了解耦,提升容錯(cuò)性與可維護(hù)性
異步提速
將不需要同步處理的并且耗時(shí)長(zhǎng)的操作由消息隊(duì)列通知消息接收方進(jìn)行異步處理。提高了應(yīng)用程序的響應(yīng)時(shí)間。
未使用MQ
有一個(gè)訂單系統(tǒng)如圖
用戶下訂單一共需要300+300+300+20=920ms,訂單系統(tǒng)需要一一調(diào)用數(shù)據(jù)庫,庫存,支付,物流系統(tǒng),耗時(shí)極大
使用MQ之后
用戶下訂單需要20+5=25ms
用戶下單后,訂單系統(tǒng)只需要進(jìn)行數(shù)據(jù)庫查詢和將數(shù)據(jù)發(fā)送到MQ即可告訴用戶下單成功,剩下的只需讓庫存,支付,物流系統(tǒng)自行去MQ中取出數(shù)據(jù)即可
小總結(jié)
提升了用戶體驗(yàn)與系統(tǒng)吞吐量
削峰填谷
未使用MQ前
有如下一個(gè)系統(tǒng)A每秒最多能處理1000個(gè)請(qǐng)求
但是當(dāng)請(qǐng)求忽然增加大于了A系統(tǒng)能處理的最大請(qǐng)求數(shù)之后就會(huì)導(dǎo)致A系統(tǒng)崩潰
使用MQ之后
如訂單系統(tǒng),在下單的時(shí)候就會(huì)往數(shù)據(jù)庫寫數(shù)據(jù)。但是數(shù)據(jù)庫只能支撐每秒1000左右的并發(fā)寫入,并發(fā)量再高就容易宕機(jī)。低峰期的時(shí)候并發(fā)也就100多個(gè),但是在高峰期時(shí)候,并發(fā)量會(huì)突然激增到5000以上,這個(gè)時(shí)候數(shù)據(jù)庫肯定卡死了。
消息被MQ保存起來了,然后系統(tǒng)就可以按照自己的消費(fèi)能力來消費(fèi),比如每秒1000個(gè)數(shù)據(jù),這樣慢慢寫入數(shù)據(jù)庫,這樣就不會(huì)卡死數(shù)據(jù)庫了。
但是使用了MQ之后,限制消費(fèi)消息的速度為1000,但是這樣一來,高峰期產(chǎn)生的數(shù)據(jù)勢(shì)必會(huì)被積壓在MQ中,高峰就被“削”掉了。但是因?yàn)橄⒎e壓,在高峰期過后的一段時(shí)間內(nèi),消費(fèi)消息的速度還是會(huì)維持在1000QPS,直到消費(fèi)完積壓的消息,這就叫做“填谷”
小結(jié)
應(yīng)用解耦:提高系統(tǒng)容錯(cuò)性與可維護(hù)性
異步提速:提升用戶體驗(yàn)和系統(tǒng)吞吐量
削峰填谷:提高系統(tǒng)穩(wěn)定性
MQ的劣勢(shì)
系統(tǒng)可用性降低
系統(tǒng)的復(fù)雜性度提高
一致性問題
系統(tǒng)可用性降低
系統(tǒng)引入的外部依賴越多,穩(wěn)定性越差,一旦MQ掛機(jī),就會(huì)對(duì)業(yè)務(wù)造成影響,需要保證MQ的高可用
系統(tǒng)的復(fù)雜性度提高
MQ的加入大大增加了系統(tǒng)的復(fù)雜度,以前系統(tǒng)之間是同步的遠(yuǎn)程調(diào)用,現(xiàn)在是通過MQ的異步調(diào)用,如何保證消息沒有重復(fù)消費(fèi)?如何處理消息丟失的情況?如何保證消息的一致性問題
一致性問題
A系統(tǒng)處理完業(yè)務(wù),通過MQ給B,C,D三個(gè)系統(tǒng)發(fā)消息數(shù)據(jù),如果B系統(tǒng),C系統(tǒng)處理成功,D系統(tǒng)處理失敗。如何保證數(shù)據(jù)處理的一致性
什么時(shí)候使用MQ
1.生產(chǎn)者不需要從消費(fèi)者處獲得反饋,引入消息隊(duì)列之前的調(diào)用,其接口返回值因該為空,這才讓異步成為了可能
2.容許短暫性的不一致
3.確實(shí)是用了可以提升系統(tǒng)穩(wěn)定性等等,即解耦,提速,削峰這些方面帶來的收益,超過了MQ,管理MQ這些成本
常見的MQ產(chǎn)品
目前業(yè)界有很多MQ產(chǎn)品,例如RabbitMQ,RocketMQ, ActiveMQ, ZeroMQ, MetaMQ , 也有直接使用Redis充當(dāng)消息隊(duì)列的,而這些消息隊(duì)列產(chǎn)品,在實(shí)際選型時(shí),需要結(jié)合自身需求與產(chǎn)品特征綜合考慮
總結(jié)
以上是生活随笔為你收集整理的RabbitMQ系列1 什么是MQ的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS基础(part8)--文本外观属性
- 下一篇: 我需要用的Jupyter Noteboo