常用互聯網高併發架構技術

高併發(High Concurrency)是互聯網分佈式系統架構設計中必須考慮因素之一,是指保證系統能夠同時並行處理很多請求。 高併發指標有響應時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Query Per Second),併發用戶數等。 響應時間:系統對請求做出響應的時間。

吞吐量:單位時間內處理的請求數量。 

併發用戶數:同時承載正常使用系統的用戶數量。 提升系統的併發能力 互聯網分佈式架構設計,提高系統併發能力的方式,方法論上主要有兩種:垂直擴展與水平擴展。

垂直擴展:提升單機處理能力。垂直擴展的方式又有兩種: 增強單機硬件性能,如:增加CPU核數,升級網卡,升級硬盤,擴充硬盤容量,擴充系統內存; 提升單機架構性能,如:使用Cache來減少IO次數,使用異步來增加單服務吞吐量,使用無鎖數據結構來減少響應時間。

水平擴展:只要增加服務器數量,就能線性擴充系統性能。水平擴展對系統架構設計是有要求的,在架構各層進行可水平擴展的設計。 互聯網分層架構 常見互聯網分佈式架構如上:

客戶端層:典型調用方是瀏覽器browser或者手機應用APP 反向代理層:系統入口,反向代理 站點應用層:實現核心應用邏輯,返回html或者json 服務層:如果實現了服務化,就有這一層 數據-緩存層:緩存加速訪問存儲 數據-數據庫層:數據庫固化數據存儲 分層水平擴展架構實踐 反向代理層的水平擴展,是通過“DNS輪詢”實現:dns-server對於一個域名配置了多個解析ip,每次DNS解析請求來訪問dns-server,會輪詢返回這些ip。 當nginx成爲瓶頸時,增加服務器數量,新增nginx服務部署,增加外網ip,就能擴展反向代理層的性能,做到理論上的無限高併發。 站點層的水平擴展,是通過“nginx”實現的。通過修改nginx.conf,可設置多web後端。 當web後端成爲瓶頸的時候,只要增加服務器數量,新增web服務部署,在nginx配置中配置上新的web後端,就能擴展站點層的性能,做到理論上的無限高併發。

服務層的水平擴展 站點層通過RPC-client調用下游的服務層RPC-server時,RPC-client中的連接池會建立與下游服務多個連接,當服務成爲瓶頸的時候,只要增加服務器數量,新增服務部署,在RPC-client處建立新的下游服務連接,就能擴展服務層性能,做到理論上的無限高併發。如果需要優雅的進行服務層自動擴容,這裏可能需要配置中心裏服務自動發現功能的支持。 數據層的水平擴展 在數據量很大的情況下,數據層(緩存,數據庫)涉及數據的水平擴展,將原本存儲在一臺服務器上的數據(緩存,數據庫)水平拆分到不同服務器上去,以達到擴充系統性能的目的。

互聯網數據層常見的水平拆分方式有這麼幾種,以數據庫爲例: 按照範圍水平拆分 每一個數據服務,存儲一定範圍的數據: u庫,存儲uid範圍1-1kw u1庫,存儲uid範圍1kw-2kw 好處: 規則簡單,service只需判斷一下uid範圍就能路由到對應的存儲服務; 數據均衡性較好; 比較容易擴展,可以隨時加一個uid[2kw,3kw]的數據服務。 不足: 負載不一定均衡。

按照哈希水平拆分 每一個數據庫,存儲某個key值hash後的部分數據: u庫,存儲偶數uid數據 u1庫,存儲奇數uid數據 好處: 規則簡單,service只需對uid進行hash能路由到對應的存儲服務; 數據均衡性較好; 請求均勻性較好。 不足: 不容易擴展,擴展一個數據服務,hash方法改變時候,可能需要進行數據遷移。

注意:,通過水平拆分來擴充系統性能,與主從同步讀寫分離來擴充數據庫性能的方式有本質的不同。 通過水平拆分擴展數據庫性能: 每個服務器上存儲的數據量是總量的1/n,單機的性能也會有提升; n個服務器上的數據沒有交集,那個服務器上數據的並集是數據的全集; 數據水平拆分到了n個服務器上,理論上讀性能擴充了n倍,寫性能也擴充了n倍(其實遠不止n倍,因爲單機的數據量變爲了原來的1/n)。

通過主從同步讀寫分離擴展數據庫性能: 每個服務器上存儲的數據量是和總量相同; n個服務器上的數據都一樣,都是全集; 理論上讀性能擴充了n倍,寫仍然是單點,寫性能不變。 緩存層的水平拆分和數據庫層的水平拆分類似,也是以範圍拆分和哈希拆分的方式居多。
本文來源:先思考後編碼(http://www.codingbefore.com)。原文鏈接:http://www.codingbefore.com/sarticle/aid/1587456455358

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章