進階分佈式架構:如何應對高併發的用戶請求

在這裏插入圖片描述

本文已收錄GitHub,更有互聯網大廠面試真題,面試攻略,高效學習資料等

互聯網應用以及雲計算的普及,使得架構設計和軟件技術的關注點從如何實現複雜的業務邏輯,轉變爲如何滿足大量用戶的高併發訪問請求。

一個簡單的計算處理過程,如果一旦面對大量的用戶訪問,整個技術挑戰就會變得完全不同,軟件開發方法、技術團隊組織、軟件的過程管理都會完全不同。

以新浪微博爲例,新浪微博最開始只有兩個工程師,一個前端,一個後端,兩個人開發了一個星期就把新浪微博開發出來了。現在許多年過去了,新浪微博的技術團隊有上千人,這些人要應對的技術挑戰,一方面來自於更多更復雜的功能,一方面來自於隨着用戶量的增加而帶來的高併發訪問壓力。

這種挑戰和壓力幾乎對所有的大型互聯網系統都是一樣的,淘寶、百度、微信等,雖然功能各不相同,但都會面對同樣的高併發用戶的訪問請求壓力。要知道,同樣的功能,供幾個人使用和供幾億人使用,技術架構是完全不同的。

當同時訪問系統的用戶不斷增加的時候,需要消耗的系統計算資源也不斷增加,需要更多的CPU 和內存去處理用戶的計算請求,需要更多的網絡帶寬去傳輸用戶的數據,需要更多的磁盤空間去存儲用戶的數據。當消耗的資源超過了服務器資源的極限的時候,服務器就會崩潰,整個系統無法正常使用。

那麼如何解決高併發的用戶請求帶來的問題?

垂直伸縮與水平伸縮

爲了應對高併發用戶訪問帶來的系統資源消耗,一種解決辦法是垂直伸縮。所謂的垂直伸縮就是提升單臺服務器的處理能力,比如用更快頻率的 CPU,用更多核的 CPU,用更大的內存,用更快的網卡,用更多的磁盤組成一臺服務器,使單臺服務器的處理能力得到提升。通過這種手段提升系統的處理能力。

在大型互聯網出現之前,傳統的行業,比如銀行、電信這些企業的軟件系統,主要是使用垂直伸縮這種手段實現系統能力的提升,在服務器上增強,提升服務器的硬件水平。當業務增長,用戶增多,服務器計算能力無法滿足要求的時候,就會用更強大的計算機,比如更換更快的 CPU 和網卡、更大的內存和磁盤,從服務器升級到小型機,從小型機提升到中型機,從中型機提升到大型機,服務器越來越強大,處理能力越來越強大,當然價格也越來越昂貴,運維越來越複雜。

垂直伸縮帶來的價格成本和服務器的處理能力並不一定呈線性關係,也就是說,增加同樣的費用,並不能得到同樣的計算能力。而且計算能力越強大,需要花費的錢就越多。

同時,受計算機硬件科技水平的制約,單臺服務器的計算能力並不能無限增加,而互聯網,特別是物聯網的計算要求幾乎是無限的。

因此,在互聯網以及物聯網領域,並不使用垂直伸縮這種方案,而是使用水平伸縮。

所謂的水平伸縮,指的是不去提升單機的處理能力,不使用更昂貴更快更厲害的硬件,而是使用更多的服務器,將這些服務器構成一個分佈式集羣,通過這個集羣,對外統一提供服務,以此來提高系統整體的處理能力。

但是要想讓更多的服務器構成一個整體,就需要在架構上進行設計,讓這些服務器成爲整體系統的一個部分,將這些服務器有效地組織起來,統一提升系統的處理能力。這就是互聯網應用和雲計算中普遍採用的分佈式架構方案。

互聯網分佈式架構演化

分佈式架構是互聯網企業在業務快速發展過程中,逐漸發展起來的一種技術架構,包括了一系列的分佈式技術方案:分佈式緩存、負載均衡、反向代理與 CDN、分佈式消息隊列、分佈式數據庫、NoSQL 數據庫、分佈式文件、搜索引擎、微服務等等,還有將這些分佈式技術整合起來的分佈式架構方案。

這些分佈式技術和架構方案是互聯網應用隨着用戶的不斷增長,爲了滿足高併發用戶訪問不斷增長的計算和存儲需求,逐漸演化出來的。可以說,幾乎所有這些技術都是由應用需求直接驅動產生的。

下面我們通過一個典型的互聯網應用的發展歷史,來看互聯網系統是如何一步一步逐漸演化出各種分佈式技術,並構成一個複雜龐大的分佈式系統的。

在最早的時候,系統因爲用戶量比較少,可能只有幾個用戶,比如剛纔提到的微博。一個應用訪問自己服務器上的數據庫,訪問自己服務器的文件系統,構成了一個單機系統,這個系統就可以滿足少量用戶使用了。

如果這個系統被證明業務上是可行的,是有價值的,那麼用戶量就會快速增長。比如像新浪微博引入了一些明星大 V 開通微博,於是迅速吸引了這些明星們的大批粉絲前來關注。這個時候服務器就不能夠承受訪問壓力了,需要進行第一次升級,數據庫與應用分離。

前面單機的時候,數據庫和應用程序是部署在一起的。進行第一次分離的時候,應用程序、數據庫、文件系統分別部署在不同的服務器上,從 1 臺服務器變成了 3 臺服務器,那麼相應的處理能力就提升了 3 倍。

這種分離幾乎是不需要花什麼技術成本的,只需要把數據庫、文件系統進行遠程部署,進行遠程訪問就可以了。

而隨着用戶進一步的增加,更多的粉絲加入微博,3 臺服務器也不能夠承受這樣的壓力了,那麼就需要使用緩存改善性能。

所謂緩存,就是將應用程序需要讀取的數據緩存在緩存中,通過緩存讀取數據,而不是通過數據庫讀取數據。緩存主要有分佈式緩存和本地緩存兩種。分佈式緩存將多臺服務器共同構成一個集羣,存儲更多的緩存數據,共同對應用程序提供緩存服務,提供更強大的緩存能力。

通過使用緩存,一方面應用程序不需要去訪問數據庫,因爲數據庫的數據是存在磁盤上的,訪問數據庫需要花費更多的時間,而緩存中的數據只是存儲在內存中的,訪問時間更短;另一方面,數據庫中的數據是以原始數據的形式存在的,而緩存中的數據通常是以結果形式存在,比如說已經構建成某個對象,緩存的就是這個對象,不需要進行對象的計算,這樣就減少了計算的時間,同時也減少了 CPU 的壓力。最主要的,應用通過訪問緩存降低了對數據庫的訪問壓力,而數據庫通常是整個系統的瓶頸所在。降低了數據庫的訪問壓力,就是改善整個系統的處理能力。

隨着用戶的進一步增加,比如微博有更多的明星加入進來,並帶來了更多的粉絲。那麼應用服務器可能又會成爲瓶頸,因爲連接大量的併發用戶的訪問,這時候就需要對應用服務器進行升級。通過負載均衡服務器,將應用服務器部署爲一個集羣,添加更多的應用服務器去處理用戶的訪問。

在微博上,我們的主要操作是刷微博,也就是讀微博。如果只是明星們發微博,粉絲刷微博,那麼對數據庫的訪問壓力並不大,因爲可以通過緩存提供微博數據。但事實上,粉絲們也要發微博,發微博就是寫數據,這樣數據庫會再一次成爲整個系統的瓶頸點。單一的數據庫並不能承受這麼大的訪問壓力。

這時候的解決辦法就是數據庫的讀寫分離,將一個數據庫通過數據複製的方式,分裂爲兩個數據庫,主數據庫主要負責數據的寫操作,所有的寫操作都複製到從數據庫上,保證從數據庫的數據和主數據庫數據一致,而從數據庫主要提供數據的讀操作。

通過這樣一種手段,將一臺數據庫服務器水平伸縮成兩臺數據庫服務器,可以提供更強大的數據處理能力。

對於大多數的互聯網應用而言,這樣的分佈式架構就已經可以滿足用戶的併發訪問壓力了。但是對於更大規模的互聯網應用而言,比如新浪微博,還需要解決海量數據的存儲與查詢,以及由此產生的網絡帶寬壓力以及訪問延遲等問題。此外隨着業務的不斷複雜化,如何實現系統的低耦合與模塊化開發、部署也成爲重要的技術挑戰。

海量數據的存儲,主要通過分佈式數據庫、分佈式文件系統、NoSQL 數據庫解決。直接在數據庫上查詢已經無法滿足這些數據的查詢性能要求,還需要部署獨立的搜索引擎提供查詢服務。同時減少數據中心的網絡帶寬壓力,提供更好的用戶訪問延時,使用 CDN 和反向代理提供前置緩存,儘快返回靜態文件資源給用戶。

爲了使各個子系統更靈活易於擴展,則使用分佈式消息隊列將相關子系統解耦,通過消息的發佈訂閱完成子系統間的協作。使用微服務架構將邏輯上獨立的模塊在物理上也獨立部署,單獨維護,應用系統通過組合多個微服務完成自己的業務邏輯,實現模塊更高級別的複用,從而更快速地開發系統和維護系統。

微服務、消息隊列、NoSQL 等這些分佈式技術在出現早期的時候,比較有技術難度和使用門檻,只在相對比較大規模的互聯網系統中使用。但是這些年隨着技術的不斷成熟,特別是雲計算的普及,使用門檻逐漸降低,許多中小規模的系統,也已經普遍使用這些分佈式技術架構設計自己的互聯網系統了。

小結

隨着互聯網越來越普及,越來越多的企業採用面向互聯網的方式開展自己的業務。傳統的IT 系統,用戶量是有限而確定的,超市系統的用戶主要是超市的收銀員,銀行系統的用戶主要是銀行的櫃員,但是超市、銀行這些企業如果使用互聯網開展自己的業務,那麼應用系統的用戶量可能會成千上萬倍地增加。

這些海量的用戶訪問企業的後端系統,就會產生高併發的訪問壓力,需要消耗巨大的計算資源,如何增加計算資源以滿足高併發的用戶訪問壓力,正是互聯網架構技術的核心驅動力。

主要就是各種分佈式技術,我將會在後續講解其中比較典型的幾種分佈式技術架構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章