高併發最全詳解 -圖文全面總結-
大家好,我是 mikechen。
高併發在大型架構佔據非常重要的位置,所以掌握好高併發就很重要了,無論是想拿高薪或進大廠,本篇我就全面來詳解高併發 @mikechen
最新 mikechen 原創超 30 萬字《阿里架構師進階專題合集》和《最全大廠面試題及答案總結》,請關注本公衆號【mikechen 的架構筆記】,後臺回覆:資料,即可領取。
高併發
高併發是指系統在同一時間內處理大量併發請求的能力,比如:天貓雙十一活動,同時在凌晨 12 點上千萬人同時來搶購商品。
這樣的場景就是典型的高併發,同一時間有大量的請求來訪問網站,這就需要系統具備高併發處理能力。
如何提高高併發能力
實現高併發性能的挑戰,包括但不限於以下幾個方面:
1. 分佈式緩存
使用緩存可以減輕服務器和數據庫的負擔,提高響應速度。
2. 負載均衡
使用負載均衡技術,將請求分發到多個服務器上,以避免單一服務器成爲性能瓶頸。
3. 數據庫優化
數據庫是很多應用的瓶頸之一,因此需要採取一系列的數據庫優化措施。
比如:常見的讀寫分離,分庫分表等數據庫優化技術。
4. 流量削峯
線上的秒殺等業務場景,需要平安度過同時搶購帶來的流量峯值的問題,這就是流量削峯。
5. 分佈式架構
將系統拆分成多個獨立的模塊,通過分佈式架構實現並行處理,提高整體的併發處理能力。
網絡優化: 優化網絡通信,減少延遲,提高數據傳輸效率。
分佈式緩存
分佈式緩存是一種將緩存數據存儲在多個節點上的系統,通過在分佈式環境中共享緩存數據,提高整體系統的性能和可擴展性。
常用的分佈式緩存包括:Redis 和 Memcached。
1.Memcached
Memcached 是一個開源的,高性能的內存綬存軟件,從名稱上看 Mem 就是內存的意思,而 Cache 就是緩存的意思。
Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態 Web 應用以減輕數據庫負載。
Memcached 通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。
2.Redis
Redis 是一個開源的使用 ANSI C 語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value 數據庫,並提供多種語言的 API。
特點:
Redis 支持多種類型的數據結構,最常用的 5 大數據類型,如下圖所示:
Redis 的持久化機制有 3 種:
1.RDB(Redis Data Base) 內存快照
RDB 快照是一次全量備份,RDB 快照是內存數據的二進制序列化形式,在存儲上非常緊湊。
2.AOF(Append Only File) 增量日誌
AOF 則是將每次執行的寫命令保存到硬盤,類似於 MySQL 的 Binlog,AOF 持久化的實時性更好,即當進程意外退出時丟失的數據更少。
3.RDB AOF 混合持久化
Redis4.0 後大部分的使用場景都不會單獨使用 RDB 或者 AOF 來做持久化機制,而是兼顧二者的優勢混合使用。
負載均衡
負載均衡(Load Balancing)是一種分佈式系統架構中的技術,用於將網絡請求或任務分散到多個服務器或資源上。
比如:當系統面臨大量用戶訪問,負載過高的時候,通常會使用增加服務器數量來進行橫向擴展來提高整個系統的處理能力。
如下圖所示:
負載均衡器使用不同的算法來選擇目標服務器。
常見的算法包括:輪詢(Round Robin)、最小連接數(Least Connections)、最小響應時間(Least Response Time)等。
有許多負載均衡軟件可用,它們提供各種負載均衡算法和功能,以滿足不同場景和需求。
比如:
-
Nginx: Nginx 是一款高性能的開源反向代理服務器,它同時也可以作爲負載均衡器使用。
-
HAProxy: HAProxy 是一款高性能的負載均衡器和反向代理服務器,它支持 TCP 和 HTTP 負載均衡,具有強大的配置選項和靈活的算法。
-
F5 BIG-IP: F5 BIG-IP 是一種商業負載均衡和應用交付控制器,它提供了廣泛的負載均衡和應用交付功能,適用於大型企業和數據中心。
數據庫優化
1. 讀寫分離
讀寫分離是一種數據庫架構設計模式,用於優化數據庫系統的性能和可伸縮性。
以下是讀寫分離的一些關鍵概念和特點:
-
主從複製(Master-Slave Replication): 讀寫分離的核心是在數據庫中使用主從複製機制。主數據庫負責處理寫操作(插入、更新、刪除等),而從數據庫則複製主數據庫的數據,用於處理讀操作。
-
讀操作分發到從庫: 所有的讀操作,例如查詢請求,被分發到從數據庫上執行。由於從數據庫不負責寫操作,因此可以更好地應對讀操作的高併發需求。
-
寫操作集中在主庫: 所有的寫操作都集中在主數據庫上執行。這確保了數據的一致性,因爲寫操作只在一個地方進行。
-
數據複製機制: 通常,從主數據庫到從數據庫的數據複製是異步的,這意味着主庫的變化不會立即反映在所有的從庫上。這可能導致在某些情況下出現讀取到舊數據的情況,因此需要在應用程序中考慮這一點。
2. 分庫分表
類似淘寶這樣的網站,海量數據的存儲和訪問成爲了系統設計的瓶頸問題,一張表超過了億級數據,都會考慮拆分。
分庫分表的核心思想,主要包含:分庫和分表
如下圖所示:
以下是分庫分表的一些關鍵概念和特點:
-
分庫: 將整個數據庫按照某種規則劃分成多個數據庫實例,通常分庫的選擇可以基於某種業務規則,例如:按照用戶 ID 範圍、按照地理位置等。
-
分表: 在每個數據庫實例中,將大表按照某種規則水平切分成多個小表,分表的規則可以是按照表的某個字段進行切分,例如按照時間、按照哈希值等。
-
水平切分: 分庫分表屬於水平切分的一種,即按行切分數據,這與垂直切分(按列切分)相對應,垂直切分通常是將表按照列的方式進行拆分。
流量削峯
流量削峯是一種通過調整系統或服務的策略,以減緩或平滑系統處理的峯值流量的過程。
削峯從本質上來說就是更多地延緩用戶請求,以及層層過濾用戶的訪問需求。
如下圖所示:
可以通過 CDN、緩存、消息中間件等方式,來一步步降低流量,從而減少對數據庫的壓力。
分佈式架構
分佈式架構會從一個拆分爲多個系統,每個系統都有獨立的數據庫等,通過這樣的橫向擴展,就可以支撐更大的併發量。
微服務架構拆分,最常見的就是 Spring Cloud 和 Spring Cloud Alibaba。
Spring Cloud 體系,包含如下:
如果還想更加深入的瞭解 Spring Cloud,請查看:Spring Cloud 最全詳解 (萬字圖文總結)
以及 Spring Cloud Alibaba 體系,包含如下:
更加詳細的請查看:微服務最全詳解 (萬字圖文總結)
總體而言,實現高併發需要綜合考慮硬件、軟件、網絡和架構等多個方面的因素,以確保系統在大量併發請求的情況下仍然能夠保持穩定、高效的運行。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/eMKxB68i3woTJ6o9TeCWLw