什麼是高併發 ,一些常見的處理方式

1、什麼是高併發html

高併發(High Concurrency)是互聯網分佈式系統架構設計中必須考慮的因素之一,它一般是指,經過設計保證系統可以同時並行處理不少請求。nginx

 

高併發相關經常使用的一些指標有響應時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Query Per Second),併發用戶數等。web

 

響應時間:系統對請求作出響應的時間。例如系統處理一個HTTP請求須要200ms,這個200ms就是系統的響應時間。數據庫

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

QPS:每秒響應請求數。在互聯網領域,這個指標和吞吐量區分的沒有這麼明顯。後端

併發用戶數:同時承載正常使用系統功能的用戶數量。例如一個即時通信系統,同時在線量必定程度上表明瞭系統的併發用戶數。瀏覽器

 

2、如何提高系統的併發能力緩存

互聯網分佈式架構設計,提升系統併發能力的方式,方法論上主要有兩種:垂直擴展(Scale Up)與水平擴展(Scale Out服務器

垂直擴展:提高單機處理能力。垂直擴展的方式又有兩種:數據結構

(1)加強單機硬件性能,例如:增長CPU核數如32核,升級更好的網卡如萬兆,升級更好的硬盤如SSD,擴充硬盤容量如2T,擴充系統內存如128G

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

 

在互聯網業務發展很是迅猛的早期,若是預算不是問題,強烈建議使用「加強單機硬件性能」的方式提高系統併發能力,由於這個階段,公司的戰略每每是發展業務搶時間,而「加強單機硬件性能」每每是最快的方法。

 

不論是提高單機硬件性能,仍是提高單機架構性能,都有一個致命的不足:單機性能老是有極限的。因此互聯網分佈式架構設計高併發終極解決方案仍是水平擴展。

 

水平擴展:只要增長服務器數量,就能線性擴充系統性能。水平擴展對系統架構設計是有要求的,如何在架構各層進行可水平擴展的設計,以及互聯網公司架構各層常見的水平擴展實踐,是本文重點討論的內容。

 

3、常見的互聯網分層架構


常見互聯網分佈式架構如上,分爲:

(1)客戶端層:典型調用方是瀏覽器browser或者手機應用APP

(2)反向代理層:系統入口,反向代理

(3)站點應用層:實現核心應用邏輯,返回html或者json

(4)服務層:若是實現了服務化,就有這一層

(5)數據-緩存層:緩存加速訪問存儲

(6)數據-數據庫層:數據庫固化數據存儲

整個系統各層次的水平擴展,又分別是如何實施的呢?

 

4、分層水平擴展架構實踐

反向代理層的水平擴展


反向代理層的水平擴展,是經過「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處創建新的下游服務鏈接,就能擴展服務層性能,作到理論上的無限高併發。若是須要優雅的進行服務層自動擴容,這裏可能須要配置中內心服務自動發現功能的支持。

 

數據層的水平擴展

在數據量很大的狀況下,數據層(緩存,數據庫)涉及數據的水平擴展,將本來存儲在一臺服務器上的數據(緩存,數據庫)水平拆分到不一樣服務器上去,以達到擴充系統性能的目的。

 

互聯網數據層常見的水平拆分方式有這麼幾種,以數據庫爲例:

按照範圍水平拆分


每個數據服務,存儲必定範圍的數據,上圖爲例:

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

 

緩存層的水平拆分和數據庫層的水平拆分相似,也是以範圍拆分和哈希拆分的方式居多,就再也不展開。

 

5、總結

高併發(High Concurrency)是互聯網分佈式系統架構設計中必須考慮的因素之一,它一般是指,經過設計保證系統可以同時並行處理不少請求。

提升系統併發能力的方式,方法論上主要有兩種:垂直擴展(Scale Up)與水平擴展(Scale Out)。前者垂直擴展能夠經過提高單機硬件性能,或者提高單機架構性能,來提升併發性,但單機性能老是有極限的,互聯網分佈式架構設計高併發終極解決方案仍是後者:水平擴展。

互聯網分層架構中,各層次水平擴展的實踐又有所不一樣:

(1)反向代理層能夠經過「DNS輪詢」的方式來進行水平擴展;

(2)站點層能夠經過nginx來進行水平擴展;

(3)服務層能夠經過服務鏈接池來進行水平擴展;

(4)數據庫能夠按照數據範圍,或者數據哈希的方式來進行水平擴展;

各層實施水平擴展後,可以經過增長服務器數量的方式來提高系統的性能,作到理論上的性能無限。

相關文章
相關標籤/搜索