如何做好高并發(fā)系統(tǒng)設(shè)計,我總結(jié)了三點
本文轉(zhuǎn)載自微信公眾號「架構(gòu)精進(jìn)之路」,作者張張。轉(zhuǎn)載本文請聯(lián)系架構(gòu)精進(jìn)之路公眾號。
大家在面試中是不是經(jīng)常被問到一個問題:“如果你系統(tǒng)的流量增加 N 倍你要怎么重新設(shè)計你的系統(tǒng)?”
這個高并發(fā)的問題可以從各個層面去解,主要包括以下幾點。
1、代碼層面
鎖優(yōu)化(采用無鎖數(shù)據(jù)結(jié)構(gòu)),主要是 concurrent 包下面的關(guān)于 AQS 鎖的一些內(nèi)容
數(shù)據(jù)庫緩存設(shè)計(降低數(shù)據(jù)庫并發(fā)爭搶壓力),這里又會有緩存、DB 數(shù)據(jù)不一致的問題,在實際使用中,高并發(fā)系統(tǒng)和數(shù)據(jù)一致性系統(tǒng)采用的策略會截然相反。
數(shù)據(jù)更新時采用合并更新,可以在應(yīng)用層去做更新合并,同一個 Container 在同一時間只會有一個 DB 更新請求。
其他的比如基于 BloomFilter 的空間換時間、通過異步化降低處理時間、通過多線程并發(fā)執(zhí)行等等。
2、數(shù)據(jù)庫層面
根據(jù)不同的存儲訴求來進(jìn)行不同的存儲選型,從早期的 RDBMS,再到 NoSql(KV 存儲、文檔數(shù)據(jù)庫、全文索引引擎等等),再到最新的 NewSql(TiDB、Google spanner/F1 DB)等等。表數(shù)據(jù)結(jié)構(gòu)的設(shè)計,字段類型選擇與區(qū)別。
索引設(shè)計,需要關(guān)注聚簇索引原理與覆蓋索引消除排序等,至于最左匹配原則都是爛大街的常識了,高級一點索引消除排序的一些機(jī)制等等,B+樹與 B 樹的區(qū)別。
最后的常規(guī)手段:分庫分表、讀寫分離、數(shù)據(jù)分片、熱點數(shù)據(jù)拆分等等,高并發(fā)往往會做數(shù)據(jù)分桶,這里面往深了去說又有很多,比如分桶如何初始化、路由規(guī)則、最后階段怎么把數(shù)據(jù)合并等等,比較經(jīng)典的方式就是把桶分成一個主桶+N 個分桶。
3、架構(gòu)設(shè)計層面
- 分布式系統(tǒng)為服務(wù)化
- 無狀態(tài)化支持水平彈性擴(kuò)縮容
- 業(yè)務(wù)邏輯層面 failfast 快速失敗
- 調(diào)用鏈路熱點數(shù)據(jù)前置
- 多級緩存設(shè)計
- 提前容量規(guī)劃等等
總結(jié)
所謂高并發(fā),常常意味著大流量,需要運用技術(shù)手段抵抗流量的沖擊,這些手段好比操作流量,能讓流量更平穩(wěn)地被系統(tǒng)所處理,帶給用戶更好的體驗。
高并發(fā)確實是一個復(fù)雜且系統(tǒng)性的問題,由于篇幅有限,諸如分布式Trace、全鏈路壓測、柔性事務(wù)都是要考慮的技術(shù)點。另外,如果業(yè)務(wù)場景不同,高并發(fā)的落地方案也會存在差異,但是總體的設(shè)計思路和可借鑒的方案基本類似。
高并發(fā)設(shè)計同樣要秉承架構(gòu)設(shè)計的3個原則:簡單、合適和嚴(yán)謹(jǐn)。不能脫離業(yè)務(wù)的實際情況,更不要過度設(shè)計,合適的方案就是最完美的。