歡迎關注文章系列 ,關注我
《提高能力,漲薪可待》
《面試知識,工做可待》
《實戰演練,拒絕996》
也歡迎關注微信公衆號【Ccww筆記】,原創技術文章第一時間推出
若是此文對你有幫助、喜歡的話,那就點個讚唄,點個關注唄!
假設你有個系統A,這個系統A會產出一個核心數據,如今下游有系統B和系統C須要使用這個數據。面試
首先想到最簡單,系統A就是直接調用系統B和系統C的接口發送數據給他們就行了數據庫
可是如今要是來了系統D、系統E、系統F、系統G,等等,十來個其餘系統都須要這份核心數據呢?
安全
這是可能會出現開發人員最頭疼的、尷尬的問題?微信
先是來一我的找他要求發送數據給一個新的系統H,系統A的同窗要修改代碼而後在那個代碼里加入調用新系統H的流程。
一會那個系統B是個陳舊老系統要下線了,告訴系統A的同窗:別給我發送數據了,接着系統A再次修改代碼再也不給這個系統B。
那咱們如今該怎麼作呢?系統的耦合性那麼高,這真是牽一髮而動全身,小需求須要大改動,何須呢?2異步
如今咱們主角要來了,可使用MQ消息中間件,讓咱們系統之間耦合度下降。性能
如今咱們只須要將系統A本身的一份核心數據發送到MQ中間件中,下游哪一個系統感興趣本身去消費便可。spa
這樣能達到一次編譯沒必要改,誰愛誰去改,反正我不改。3d
總結:經過 MQ 消息中間件的使用,重構系統之間的耦合,讓系統具有高度的可擴展性。中間件
假設你有一個系統調用鏈路,是系統A調用系統B,通常耗時20ms;系統B調用系統C,通常耗時200ms;系統C調用系統D,通常耗時2sblog
用戶一個請求過來巨慢無比,就像走過長長的套路同樣
由於走完一個鏈路,須要耗費:
20ms + 200ms + 2000ms(2s) = 2220ms,
也就是2秒多的時間。可是實際上,鏈路中的系統A調用系統B,系統B調用系統C,這兩個步驟起來也就220ms。
這時候主角大佬又慢慢的過來了,這都搞不定,不是很簡單嗎?
實現思路就是系統A -> 系統B -> 系統C,直接就耗費220ms後直接成功了。而後系統C就是發送個消息到MQ中間件裏,由系統D消費到消息以後慢慢的異步來執行這個耗時2s的業務處理。經過這種方式直接將核心鏈路的執行性能提高了10倍。
總結:
假設你有一個系統,平時正常的時候每秒可能就幾百個請求,系統部署在8核16G的機器的上,正常處理都是OK的,每秒幾百請求是能夠輕鬆抗住的。
好比秒殺活動
在秒殺活動在高峯期一會兒來了每秒鐘幾千、萬請求,彈指一揮間出現了流量高峯。
若是時候出現機器宕機,公司損失但是大大的,這是你是否是該準備好被老闆痛罵,甚至可能要say goodbye
可能想到的解決的方式,線上部署了不少臺機器,一多制勝的方法:
可是,假設除了秒殺活動達到瞬時高峯,其它時間基本爲每秒就幾百請求,若是你線上部署了不少臺機器,就是爲了此次秒殺活動,這有點浪費機器資源。
因此這時,MQ大哥又出現了,不怕,這不是還有我嗎?
在全部機器前面部署一層MQ,平時每秒幾百請求你們均可以輕鬆接收消息。
一旦到了瞬時高峯期,一下涌入每秒幾千的請求,就能夠積壓在MQ裏面,而後那一臺機器慢慢的處理和消費。
總結:削峯從本質上來講就是更多地延緩用戶請求,以及層層過濾用戶的訪問需求,聽從「最後落地到數據庫的請求數要儘可能少」的原則。
系統A要發送一個消息到多個系統,若是此時每增長一個系統,系統A都須要經過修改源碼來增長接口,此時耦合很是高,可是若是中間使用消息隊列的話,系統只須要發送一次到消息隊列,別的系統就能複用該信息,當增長或刪除系統調用接口的時候,不須要額外的更新代碼。
用戶調用一個接口的時候,可能該接口調用了別的方法。例如:用戶註冊的時候,後臺可能須要調用:查詢數據庫,插入數據庫,發送郵件,發送用戶指南等等...
可是用戶可能並不須要後臺將全部的任務執行完畢,那麼此時在初入數據口後面加入mq隊列,用戶就能很快獲得註冊成功的響應而去作一些別的事情。mq的機制又能保證最終的一致性,因此使用起來很安全很穩定。
何爲削峯,就是當系統壓力過大的時候,讓系統壓力減少。如何作?
好比,平時可能數據庫的讀寫每秒幾百,在流量高峯期,系統的訪問達到了每秒10000。此時因爲加入了消息隊列,因此不會出現激增的訪問致使系統奔潰。
削峯並不會讓用戶的等待時間減小,因此通常會跟異步搭配來使用
最後MQ還有其餘場景,通知、數據分發等等,能體現使用MQ中間件的好處。
也歡迎關注微信公衆號【Ccww筆記】,原創技術文章第一時間推出