天天看點

網際網路架構之 “高并發” 詳解

一、什麼是高并發

高并發(High Concurrency)是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時并行處理很多請求。

高并發相關常用的一些名額有響應時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Query Per Second),并發使用者數等。

響應時間:系統對請求做出響應的時間。例如系統處理一個HTTP請求需要200ms,這個200ms就是系統的響應時間。

吞吐量:機關時間内處理的請求數量。

QPS:每秒響應請求數。在網際網路領域,這個名額和吞吐量區分的沒有這麼明顯。

并發使用者數:同時承載正常使用系統功能的使用者數量。例如一個即時通訊系統,同時線上量一定程度上代表了系統的并發使用者數。

二、如何提升系統的并發能力

網際網路分布式架構設計,提高系統并發能力的方式,方法論上主要有兩種:垂直擴充(Scale Up)與水準擴充(Scale Out)。

垂直擴充:提升單機處理能力。垂直擴充的方式又有兩種:

(1)增強單機硬體性能,例如:增加CPU核數如32核,更新更好的網卡如萬兆,更新更好的硬碟如SSD,擴充硬碟容量如2T,擴充系統記憶體如128G;

(2)提升單機架構性能,例如:使用Cache來減少IO次數,使用異步來增加單服務吞吐量,使用無鎖資料結構來減少響應時間;

在網際網路業務發展非常迅猛的早期,如果預算不是問題,強烈建議使用“增強單機硬體性能”的方式提升系統并發能力,因為這個階段,公司的戰略往往是發展業務搶時間,而“增強單機硬體性能”往往是最快的方法。

不管是提升單機硬體性能,還是提升單機架構性能,都有一個緻命的不足:單機性能總是有極限的。是以網際網路分布式架構設計高并發終極解決方案還是水準擴充。

水準擴充:隻要增加伺服器數量,就能線性擴充系統性能。水準擴充對系統架構設計是有要求的,如何在架構各層進行可水準擴充的設計,以及網際網路公司架構各層常見的水準擴充實踐,是本文重點讨論的内容。

三、常見的網際網路分層架構

網際網路架構之 “高并發” 詳解

 常見網際網路分布式架構如上,分為:

(1)用戶端層:典型調用方是浏覽器browser或者手機應用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、資料層的水準擴充

在資料量很大的情況下,資料層(緩存,資料庫)涉及資料的水準擴充,将原本存儲在一台伺服器上的資料(緩存,資料庫)水準拆分到不同伺服器上去,以達到擴充系統性能的目的。

網際網路資料層常見的水準拆分方式有這麼幾種,以資料庫為例:

5、按照範圍水準拆分

網際網路架構之 “高并發” 詳解

每一個資料服務,存儲一定範圍的資料,上圖為例:

user0庫,存儲uid範圍1-1kw

user1庫,存儲uid範圍1kw-2kw

這個方案的好處是:

(1)規則簡單,service隻需判斷一下uid範圍就能路由到對應的存儲服務;

(2)資料均衡性較好;

(3)比較容易擴充,可以随時加一個uid[2kw,3kw]的資料服務;

不足是:

(1)請求的負載不一定均衡,一般來說,新注冊的使用者會比老使用者更活躍,大range的服務請求壓力會更大;

6、按照哈希水準拆分

網際網路架構之 “高并發” 詳解

每一個資料庫,存儲某個key值hash後的部分資料,上圖為例:

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倍,寫仍然是單點,寫性能不變;

緩存層的水準拆分和資料庫層的水準拆分類似,也是以範圍拆分和哈希拆分的方式居多,就不再展開。

繼續閱讀