(1)一道面試題的背景引入
各位在面試的時候很容易會被問到,你們的系統是怎麼處理高併發的場景的?讓很多人頭疼不已,今天就給大家科普一下。
(2)先考慮乙個最簡單的系統架構
簡單的架構,單機部署,單資料庫。
差不多每秒十次左右。
此時假設你的系統使用者量總共就10萬左右。
分攤到每一秒也就:10次。完全不用考慮併發的問題。
(3)系統集群化部署
此時如果使用者增長到了500萬,每秒的請求500次左右。
然後對資料庫的每秒請求數量是1500/s,這個時候會怎麼樣呢?
4核8g的機器每秒請求達到500/s的時候,很可能你會發現你的機器cpu負載較高了。
資料庫層面,以上述的配置而言,其實基本上1500/s的高峰請求壓力的話,還算可以接受。
你可以在前面掛乙個負載均衡層,把請求均勻打到系統層面,讓系統可以用多台機器集群化支撐更高的併發壓力。
但是集群的設計需要乙個請求分發機構:負載均衡系統架構就變成這樣了。
(4)資料庫分庫分表 + 讀寫分離
假設此時使用者量繼續增長,達到了1000萬註冊使用者,然後每天日活使用者是100萬。
那麼此時對系統層面的請求量會達到每秒1000/s,系統層面,你可以繼續通過集群化的方式來擴容,反正前面的負載均衡層會均勻分散流量過去的。
但是,這時資料庫層面接受的請求量會達到3000/s,這個就有點問題了。
超過了平均1500上限的兩倍。
沒錯,一般來說,對那種普通配置的線上資料庫,建議就是讀寫併發加起來,按照上述我們舉例的那個配置,不要超過3000/s。
首先乙個問題就是高峰期系統效能可能會降低,因為資料庫負載過高對效能會有影響。
另外乙個萬一把你的資料庫給搞掛了 咋辦。
所以此時你必須得對系統做分庫分表 + 讀寫分離,也就是把乙個庫拆分為多個庫,部署在多個資料庫服務上,這是作為主庫承載寫入請求的。
然後每個主庫都掛載至少乙個從庫,由從庫來承載讀請求
此時假設對資料庫層面的讀寫併發是3000/s,其中寫併發佔到了1000/s,讀併發佔到了2000/s。
(5)快取集群引入
接著就好辦了,如果你的註冊使用者量越來越大,此時你可以不停的加機器,比如說系統層面不停加機器,就可以承載更高的併發請求。
但是這裡有乙個很大的問題:資料庫其實本身不是用來承載高併發請求的,所以通常來說,資料庫單機每秒承載的併發就在幾千的數量級,而且資料庫使用的機器都是比較高配置,比較昂貴的機器,成本很高。
快取系統的設計就是為了承載高併發而生。
所以單機承載的併發量都在每秒幾萬,甚至每秒數十萬,對高併發的承載能力比資料庫系統要高出一到兩個數量級。
具體來說,就是在寫資料庫的時候同時寫乙份資料到快取集群裡,然後用快取集群來承載大部分的讀請求。
• 不要盲目進行資料庫擴容,資料庫伺服器成本昂貴,且本身就不是用來承載高併發的
• 針對寫少讀多的請求,引入快取集群,用快取集群抗住大量的讀請求
(6)引入訊息中介軟體集群
接著再來看看資料庫寫這塊的壓力,其實是跟讀類似的。
假如說你所有寫請求全部都落地資料庫的主庫層,當然是沒問題的,但是寫壓力要是越來越大了呢?
比如每秒要寫幾萬條資料,此時難道也是不停的給主庫加機器嗎?
這時訊息中介軟體的分流的作用就凸顯出來了。mq集群,他是非常好的做寫請求非同步化處理,實現削峰填谷的效果。
假如說,你現在每秒是1000/s次寫請求,其中比如500次請求是必須請求過來立馬寫入資料庫中的,但是另外500次寫請求是可以允許非同步化等待個幾十秒,甚至幾分鐘後才落入資料庫內的。
大家看上面的架構圖,首先訊息中介軟體系統本身也是為高併發而生,所以通常單機都是支撐幾萬甚至十萬級的併發請求的。
所以,他本身也跟快取系統一樣,可以用很少的資源支撐很高的併發請求,用他來支撐部分允許非同步化的高併發寫入是沒問題的,比使用資料庫直接支撐那部分高併發請求要減少很多的機器使用量。
以上介紹了幾種方式:
web應用服務開發
serverless 架構應該會是未來的乙個新趨勢。得益於我司十幾年前一幫大神資料庫表模型設計的優異,一開始剛進公司的時候,很是驚嘆。通過客戶端配配屬性,乙個查詢頁面和乙個資源實體的屬性控制項頁面就生成好了。每週花十五分鐘閱讀就可以了解最新的 swift 開發進度 okhttp 使用小記 快取和驗證...
web應用服務簡述
動態資源即通過程式 j a php python net 和資料庫 mysql oracle sqlserver 根據業務處理流程動態生成網頁的html,再將html響應給請求 客戶端 http 1.0 1.1 2.0 和html的關係 1.客戶端封裝http請求 httprequest 向服務端發...
web服務端的架構演變
最近lofter專案碰到很多效能上的問題,特別是資料庫相關的,每次推送後,告警就會第一時間到來。這些問題隨著產品的不斷擴充套件,我想大家肯定都遇到過。目前我們解決效能問題一般都是兩種方法 一是加快取,減少資料庫壓力 二嘛,就是加伺服器了。如果產品的規模繼續迅速增長,我們應該怎麼做?靠增加伺服器肯定不...