究竟啥才是互連網架構“高並發”_HighConcurrency

來源:互聯網
上載者:User

一、什麼是高並發

高並發(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)反向 Proxy層:系統入口,反向 Proxy

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

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

(5)資料-緩衝層:緩衝加速訪問儲存

(6)資料-資料庫層:資料庫固化資料存放區

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

 

四、分層水平擴充架構實踐

反向 Proxy層的水平擴充


反向 Proxy層的水平擴充,是通過“DNS輪詢”實現的:dns-server對於一個網域名稱配置了多個解析ip,每次DNS解析請求來訪問dns-server,會輪詢返回這些ip。

當nginx成為瓶頸的時候,只要增加伺服器數量,新增nginx服務的部署,增加一個外網ip,就能擴充反向 Proxy層的效能,做到理論上的無限高並發。

 

網站層的水平擴充


網站層的水平擴充,是通過“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的服務要求壓力會更大;

 

按照雜湊水平分割


每一個資料庫,儲存某個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倍,寫仍然是單點,寫效能不變;

 

緩衝層的水平分割和資料庫層的水平分割類似,也是以範圍拆分和雜湊拆分的方式居多,就不再展開。

 

五、總結

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

提高系統並發能力的方式,方法論上主要有兩種:垂直擴充(Scale Up)與水平擴充(Scale Out)。前者垂直擴充可以通過提升單機硬體效能,或者提升單機架構效能,來提高並發性,但單機效能總是有極限的,互連網分布式架構設計高並發終極解決方案還是後者:水平擴充。

互連網分層架構中,各層次水平擴充的實踐又有所不同:

(1)反向 Proxy層可以通過“DNS輪詢”的方式來進行水平擴充;

(2)網站層可以通過nginx來進行水平擴充;

(3)服務層可以通過服務串連池來進行水平擴充;

(4)資料庫可以按照資料範圍,或者資料雜湊的方式來進行水平擴充;

各層實施水平擴充後,能夠通過增加伺服器數量的方式來提升系統的效能,做到理論上的效能無限。

 

末了,希望文章的思路是清晰的,希望大家對高並發的概念和實踐有個系統的認識,結合上一篇《究竟啥才是互連網架構“高可用”》的分享互連網分布式架構是不是逐步的不再神秘啦。

==【完】==

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.