RabbitMQ系列1 什么是MQ
MQ(Messgae Queue)
什么是MQ
MQ全稱為Message Queue,即消息隊列,消息隊列是應用程序與應用程序之間通信的一致方法,即在消息的傳輸過程中保存消息的容器,多用于分布式系統(tǒng)之間的通信
分布式系統(tǒng)通信的兩種方式
直接遠程調(diào)用
借助第三方完成間接通信
發(fā)送方稱為生產(chǎn)者
接收方稱為消費者
MQ的優(yōu)勢
應用解耦
異步提速
削峰填谷
應用解耦
MQ相當于一個中介,生產(chǎn)方通過MQ與消費方交互,它將應用程序進行解耦合。
未使用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)只要將對應的數(shù)據(jù)發(fā)送到MQ即可,而庫存系統(tǒng),支付系統(tǒng),物流系統(tǒng)只需MQ中取出對應的數(shù)據(jù)即可
如果庫存系統(tǒng)出現(xiàn)了錯誤,也不會影響到訂單系統(tǒng),比如庫存系統(tǒng)由于訪問量過大突然卡了幾秒鐘,幾秒鐘之后可能就好了,好了之后再到MQ中取出對應的數(shù)據(jù)即可
比如我們要接入一個系統(tǒng),我們不需要再修改訂單系統(tǒng)的源碼,直接讓該系統(tǒng)去MQ中取出對應的數(shù)據(jù)即可
小總結(jié):
使用MQ使得應用之間實現(xiàn)了解耦,提升容錯性與可維護性
異步提速
將不需要同步處理的并且耗時長的操作由消息隊列通知消息接收方進行異步處理。提高了應用程序的響應時間。
未使用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個請求
但是當請求忽然增加大于了A系統(tǒng)能處理的最大請求數(shù)之后就會導致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é)
應用解耦:提高系統(tǒng)容錯性與可維護性
異步提速:提升用戶體驗和系統(tǒng)吞吐量
削峰填谷:提高系統(tǒng)穩(wěn)定性
MQ的劣勢
系統(tǒng)可用性降低
系統(tǒng)的復雜性度提高
一致性問題
系統(tǒng)可用性降低
系統(tǒng)引入的外部依賴越多,穩(wěn)定性越差,一旦MQ掛機,就會對業(yè)務造成影響,需要保證MQ的高可用
系統(tǒng)的復雜性度提高
MQ的加入大大增加了系統(tǒng)的復雜度,以前系統(tǒng)之間是同步的遠程調(diào)用,現(xiàn)在是通過MQ的異步調(diào)用,如何保證消息沒有重復消費?如何處理消息丟失的情況?如何保證消息的一致性問題
一致性問題
A系統(tǒng)處理完業(yè)務,通過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充當消息隊列的,而這些消息隊列產(chǎn)品,在實際選型時,需要結(jié)合自身需求與產(chǎn)品特征綜合考慮
總結(jié)
以上是生活随笔為你收集整理的RabbitMQ系列1 什么是MQ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS基础(part8)--文本外观属性
- 下一篇: 从美国总经理,到三一重卡的董事长,梁林河