一、什麼是高併發
高併發(
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次數,使用非同步來增加單服務吞吐量,使用無鎖資料結構來減少響應時間;
在網際網路業務發展非常迅猛的早期,如果預算不是問題,強烈建議使用「增強單機硬體效能」的方式提公升系統併發能力,因為這個階段,公司的戰略往往是發展業務搶時間,而「增強單機硬體效能」往往是最快的方法。
不管是提公升單機硬體效能,還是提公升單機架構效能,都有乙個致命的不足:單機效能總是有極限的。所以網際網路分布式架構設計高併發終極解決方案還是水平擴充套件。
水平擴充套件
:只要增加伺服器數量,就能線性擴充系統效能。水平擴充套件對系統架構設計是有要求的,如何在架構各層進行可水平擴充套件的設計,以及網際網路公司架構各層常見的水平擴充套件實踐,是本文重點討論的內容。
三、常見的網際網路分層架構
常見網際網路分布式架構如上,分為:
(2)反向**層:系統入口,反向**
(3)站點應用層:實現核心應用邏輯,返回html或者json
(4)服務層:如果實現了服務化,就有這一層
(5)資料
-快取層
:快取加速訪問儲存
(6)資料
-資料庫層
:資料庫固化資料儲存
整個系統各層次的水平擴充套件,又分別是如何實施的呢?
四、分層水平擴充套件架構實踐
反向**層的水平擴充套件
反向**層的水平擴充套件,是通過「
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的服務請求壓力會更大;
按照雜湊水平拆分
每乙個資料庫,儲存某個
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)反向**層可以通過「dns輪詢」的方式來進行水平擴充套件;
(2)站點層可以通過nginx來進行水平擴充套件;
(3)服務層可以通過服務連線池來進行水平擴充套件;
(4)資料庫可以按照資料範圍,或者資料雜湊的方式來進行水平擴充套件;
各層實施水平擴充套件後,能夠通過增加伺服器數量的方式來提公升系統的效能,做到理論上的效能無限。
提高IIS的併發量
iis 7.0使用的是預設配置,伺服器最多只能處理5000個同時請求。根據相關文件調整設定,可以讓伺服器從設定上支援10萬個同時請求 1.調整iis 7應用程式池佇列長度 由原來的預設1000改為65535。queue length 655352 由原來的預設5000改為100000。100000 ...
如何應對高併發?
參照乙個大佬的文章,我也寫一篇高併發的文章,一下這門高階的現象,以及一些解決措施。乙個關於高併發的問題 那位大佬說 如果真的幹過高併發系統的人,面試官是絕對不會對你提出這個問題的,否則就是他太不明智了。至於為嘛這樣說呢,因為如果設計乙個高併發系統,這句話就是錯誤的了,因為在脫離了業務的系統架構中都是...
sql高併發量處理研究
關於資料庫的高併發處理研究,蟲子只是淺嘗輒止。可能很多方面各位大牛都用過,蟲子就來丟醜一下了。基於web方面的減壓蟲子已經在博文中介紹過 就不贅述了 本章我們著重介紹下基於資料庫的解決方案 1.分庫分表 按業務來算,橫向分庫 縱向分表。2.資料庫集群和庫表雜湊 大型 都有複雜的應用,這些應用必須使用...