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