高併發及概述

1、什麼是高併發
 
一般是指併發訪問。也就是在某個時間點,有多少個訪問同時到來。例如淘寶。 網站比並發性能很差的話, 遭遇惡意併發攻擊, 形成服務器崩潰。
 
高併發(High Concurrency)是互聯網分佈式系統架構設計中必須考慮的因素之一,它一般是指,經過設計保證系統可以同時並行處理不少請求。
高併發相關經常使用的一些指標有響應時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Query Per Second),併發用戶數等。
響應時間:系統對請求作出響應的時間。例如系統處理一個HTTP請求須要200ms,這個200ms就是系統的響應時間。
吞吐量:單位時間內處理的請求數量。
QPS:每秒響應請求數。在互聯網領域,這個指標和吞吐量區分的沒有這麼明顯。
併發用戶數:同時承載正常使用系統功能的用戶數量。例如一個即時通信系統,同時在線量必定程度上表明瞭系統的併發用戶數。
 
如何提高系統併發性能:
提高吞吐量:  數據庫上增長索引  增長併發數,減小平均響應時間,
 
互聯網分佈式架構設計 : 提升系統 併發能力,方法理論上主要有兩種: 垂直式擴展和水平式擴展。
垂直擴展: 提高單機處理能力 可分爲 
   1, 加強單機硬件性能,例如:增長CPU 核數。升級更好的網卡,升級更好的硬盤,擴充系統內存等
   2, 提高單機架構性能: 例如使用Cache來減小IO 次數,使用異步來增長單服務吞吐量,使用無鎖數據結構來減小響應時間。
可是單機性能老是有極限的,因此互聯網分佈式架構設計高併發終極解決方法仍是水平擴展。
 
水平擴展:     只要增長服務器數量, 就能線性擴充系統性能,水平擴展對系統架構設計是有要求的,
  常見互聯網分佈式系統架構分爲: 
 1  客戶端層: 典型調用方法是瀏覽器或者手機APP
 2  反向代理;  系統入口,反向代理。
 3  站點應用層:實現核心應用邏輯,返回html 或者json 
 4  服務層:若是實現了服務化,就有這一層。
 5  數據--緩存層: 緩存加速訪問存儲
 6  數據--數據庫層: 數據庫固化數據存儲。
    
各個系統層次的水平擴展
 
1 反向代理層的水平擴展
 是經過DNS 輪詢實現的:dns-server對於一個域名配置 了多個解析ip,每次DNS解析請求來訪問dns-server,會輪詢返回這些ip。
nginx成爲瓶頸的時候,只要增長服務器數量,新增nginx服務的部署,增長一個外網ip,就能擴展反向代理層的性能,作到理論上的無限高併發。
 
2  站點層的水平擴展:
是經過「nginx」實現的。經過修改nginx.conf,能夠設置多個web後端。
web後端成爲瓶頸的時候,只要增長服務器數量,新增web服務的部署,在nginx配置中配置上新的web後端,就能擴展站點層的性能,作到理論上的無限高併發。
 
3  服務層的水平擴展
服務層的水平擴展,是經過「服務鏈接池」實現的。
站點層經過RPC-client調用下游的服務層RPC-server時,RPC-client中的鏈接池會創建與下游服務多個鏈接,當服務成爲瓶頸的時候,只要增長服務器數量,新增服務部署,在RPC-client處創建新的下游服務鏈接,就能擴展服務層性能,作到理論上的無限高併發。若是須要優雅的進行服務層自動擴容,這裏可能須要配置中內心服務自動發現功能的支持。
 
4   數據層的水平擴展
在數據量很大的狀況下,數據層(緩存,數據庫)涉及數據的水平擴展,將本來存儲在一臺服務器上的數據(緩存,數據庫)水平拆分到不一樣服務器上去,以達到擴充系統性能的目的。
 
互聯網數據層常見的水平拆分方式有這麼幾種,以數據庫爲例:
按照範圍水平拆分
每個數據服務,存儲必定範圍的數據,上圖爲例:
user0庫,存儲uid範圍1-1kw
user1庫,存儲uid範圍1kw-2kw
這個方案的好處是:
(1)規則簡單,service只需判斷一下uid範圍就能路由到對應的存儲服務;
(2)數據均衡性較好;
(3)比較容易擴展,能夠隨時加一個uid[2kw,3kw]的數據服務;
不足是:
(1)      請求的負載不必定均衡,通常來講,新註冊的用戶會比老用戶更活躍,大range的服務請求壓力會更大;
 
 
按照哈希水平拆分
每個數據庫,存儲某個keyhash後的部分數據,上圖爲例:
user0庫,存儲偶數uid數據
user1庫,存儲奇數uid數據
這個方案的好處是:
(1)規則簡單,service只需對uid進行hash能路由到對應的存儲服務;
(2)數據均衡性較好;
(3)請求均勻性較好;
不足是:
(1)不容易擴展,擴展一個數據服務,hash方法改變時候,可能須要進行數據遷移;
 
這裏須要注意的是,經過水平拆分來擴充系統性能,與主從同步讀寫分離來擴充數據庫性能的方式有本質的不一樣。
經過水平拆分擴展數據庫性能:
(1)每一個服務器上存儲的數據量是總量的1/n,因此單機的性能也會有提高;
(2)n個服務器上的數據沒有交集,那個服務器上數據的並集是數據的全集;
(3)數據水平拆分到了n個服務器上,理論上讀性能擴充了n倍,寫性能也擴充了n倍(其實遠不止n倍,由於單機的數據量變爲了原來的1/n);
經過主從同步讀寫分離擴展數據庫性能:
(1)每一個服務器上存儲的數據量是和總量相同;
(2)n個服務器上的數據都同樣,都是全集;
(3)理論上讀性能擴充了n倍,寫仍然是單點,寫性能不變;
緩存層的水平拆分和數據庫層的水平拆分相似,也是以範圍拆分和哈希拆分的方式居多,就再也不展開。
 
 
總結: 
 
高併發(High Concurrency)是互聯網分佈式系統架構設計中必須考慮的因素之一,它一般是指,經過設計保證系統可以同時並行處理不少請求
提升系統併發能力的方式,方法論上主要有兩種:垂直擴展(Scale Up)與水平擴展(Scale Out)。前者垂直擴展能夠經過提高單機硬件性能,或者提高單機架構性能,來提升併發性,但單機性能老是有極限的,互聯網分佈式架構設計高併發終極解決方案仍是後者:水平擴展
互聯網分層架構中,各層次水平擴展的實踐又有所不一樣:
1)反向代理層能夠經過「DNS輪詢」的方式來進行水平擴展;
2)站點層能夠經過nginx來進行水平擴展;
3)服務層能夠經過服務鏈接池來進行水平擴展;
4)數據庫能夠按照數據範圍,或者數據哈希的方式來進行水平擴展;
各層實施水平擴展後,可以經過增長服務器數量的方式來提高系統的性能,作到理論上的性能無限。
相關文章
相關標籤/搜索