分布式架構:如何應對高并發(fā)的用戶請求
隨著互聯(lián)網應用和云計算的普及,架構設計和軟件技術的關注重點已從實現復雜業(yè)務邏輯逐漸轉變?yōu)闈M足大量用戶的高并發(fā)訪問需求。一個簡單的計算過程,在面對大量用戶訪問時會帶來截然不同的技術挑戰(zhàn),這也直接影響到軟件開發(fā)方法、技術團隊組織以及軟件過程管理方式,推動它們發(fā)生全面轉型。
以新浪微博為例,最初該項目由兩位工程師負責,一個前端和一個后端,他們在一周內就完成了新浪微博的開發(fā)。然而,隨著時間的推移,新浪微博的技術團隊已經擴大到上千人。這支團隊面臨的技術挑戰(zhàn)主要來源于兩個方面:一是日益復雜的功能需求,二是用戶數量的增加所帶來的高并發(fā)訪問壓力。
這種挑戰(zhàn)和壓力幾乎普遍存在于所有大型互聯(lián)網系統(tǒng)中,比如淘寶、百度和微信等。盡管這些平臺的功能各不相同,但它們都必須應對相似的高并發(fā)用戶訪問請求。需要注意的是,同樣的功能,如果是供少數人使用,與供幾億人使用,其技術架構差異是巨大的。
當同時訪問系統(tǒng)的用戶數量不斷增加時,系統(tǒng)所需消耗的計算資源也隨之上升。這意味著需要更多的 CPU 和內存來處理用戶的請求,更多的網絡帶寬來傳輸數據,以及更多的磁盤空間來存儲用戶的信息。一旦資源消耗超過了服務器的承載極限,服務器就可能崩潰,導致整個系統(tǒng)無法正常運行。
垂直伸縮與水平伸縮
為應對高并發(fā)用戶訪問所帶來的系統(tǒng)資源消耗,一種常見的解決方案是垂直伸縮。垂直伸縮指的是提升單臺服務器的處理能力,例如,通過更快頻率的 CPU、更多核心的 CPU、更大容量的內存、更快的網卡,以及更多的磁盤來增強單臺服務器的性能。這種方法可以有效提升系統(tǒng)的處理能力。
在大型互聯(lián)網應用出現之前,傳統(tǒng)行業(yè)(如銀行和電信)主要依賴垂直伸縮來提升系統(tǒng)能力。隨著業(yè)務增長和用戶數量的增加,當服務器的計算能力無法滿足需求時,企業(yè)通常會選擇更強大的計算機,逐步更換更快的 CPU、更大的內存和磁盤,或者將服務器從小型機升級到中型機,再到大型機。雖然服務器的處理能力不斷增強,但其成本也隨之上升,運維管理的復雜性也增加了。
垂直伸縮所帶來的成本與服務器處理能力之間并不一定呈線性關系。這意味著,即使投入相同的費用,也不一定能夠獲得相應的計算能力。此外,隨著計算能力的提升,所需的資金支出往往會顯著增加。同時,受限于計算機硬件科技的水平,單臺服務器的計算能力無法無限制地增加,而互聯(lián)網,尤其是物聯(lián)網的計算需求幾乎是無止境的。因此,在互聯(lián)網及物聯(lián)網領域,垂直伸縮并不是首選方案,反而更傾向于采用水平伸縮。
水平伸縮的核心在于不再提升單臺服務器的處理能力,而是通過增加更多的服務器來構建一個分布式集群。該集群能夠統(tǒng)一對外提供服務,從而提高整體系統(tǒng)的處理能力。要實現這一點,需要在架構設計上進行充分考慮,將多臺服務器有效地整合,使其成為系統(tǒng)的一個整體,從而實現資源的統(tǒng)一管理與處理能力的提升。這一策略已成為互聯(lián)網應用和云計算中普遍采用的分布式架構方案。
互聯(lián)網分布式架構演化
分布式架構是互聯(lián)網企業(yè)在業(yè)務快速發(fā)展過程中,逐漸發(fā)展起來的一種技術架構,包括了一系列的分布式技術方案:分布式緩存、負載均衡、反向代理與 CDN、分布式消息隊列、分布式數據庫、NoSQL 數據庫、分布式文件、搜索引擎、微服務等等,還有將這些分布式技術整合起來的分布式架構方案。
這些分布式技術和架構方案是互聯(lián)網應用隨著用戶的不斷增長,為了滿足高并發(fā)用戶訪問不斷增長的計算和存儲需求,逐漸演化出來的??梢哉f,幾乎所有這些技術都是由應用需求直接驅動產生的。
下面我們通過一個典型的互聯(lián)網應用的發(fā)展歷史,來看互聯(lián)網系統(tǒng)是如何一步一步逐漸演化出各種分布式技術,并構成一個復雜龐大的分布式系統(tǒng)的。
在最早的時候,系統(tǒng)因為用戶量比較少,可能只有幾個用戶,比如剛才提到的微博。一個應用訪問自己服務器上的數據庫,訪問自己服務器的文件系統(tǒng),構成了一個單機系統(tǒng),這個系統(tǒng)就可以滿足少量用戶使用了。
圖片
如果這個系統(tǒng)經過驗證在業(yè)務上是可行且有價值的,那么用戶量將會迅速增長。例如,新浪微博通過引入一些明星大V開通微博,迅速吸引了大量粉絲關注。在這種情況下,服務器將無法承受不斷增加的訪問壓力,因此需要進行首次升級,具體措施是將數據庫與應用進行分離。
圖片
在系統(tǒng)最初的單機架構中,數據庫和應用程序是部署在同一臺服務器上的。當進行首次分離時,應用程序、數據庫和文件系統(tǒng)被分別部署到不同的服務器上,從一臺服務器擴展為三臺服務器,從而使處理能力提升了三倍。這一分離過程幾乎不需要額外的技術成本,只需將數據庫和文件系統(tǒng)進行遠程部署并進行遠程訪問即可。
然而,隨著用戶數量的進一步增加,微博吸引了越來越多的粉絲,三臺服務器也開始無法滿足這種增長帶來的壓力。此時,為了改善系統(tǒng)性能,就需要引入緩存機制來進一步提升處理能力。
圖片
所謂緩存,是指將應用程序需要讀取的數據存儲在緩存中,以便通過緩存來讀取數據,而非直接從數據庫中讀取。緩存主要分為兩種類型:分布式緩存和本地緩存。分布式緩存將多臺服務器構成一個集群,共同存儲更大規(guī)模的緩存數據,從而為應用程序提供更強大的緩存服務。
通過使用緩存,應用程序可以避免頻繁訪問數據庫。因為數據庫中的數據存儲在磁盤上,訪問數據庫的速度相對較慢,而緩存中的數據則存儲在內存中,訪問速度更快。此外,數據庫中的數據通常以原始形式存在,而緩存中的數據則往往以結果形式存在,例如已經構建好的對象,這樣可以省去對象計算的時間,降低 CPU 的壓力。
最重要的是,應用程序通過訪問緩存可以顯著降低對數據庫的訪問壓力,而數據庫通常是整個系統(tǒng)的瓶頸所在。因此,減少數據庫的訪問壓力能夠有效改善整個系統(tǒng)的處理能力。
隨著用戶的進一步增加,比如微博有更多的明星加入進來,并帶來了更多的粉絲。那么應用服務器可能又會成為瓶頸,因為連接大量的并發(fā)用戶的訪問,這時候就需要對應用服務器進行升級。通過負載均衡服務器,將應用服務器部署為一個集群,添加更多的應用服務器去處理用戶的訪問。
圖片
在微博平臺上,用戶的主要操作是瀏覽微博,也就是讀取微博內容。在這種情況下,如果僅僅是明星發(fā)布微博,粉絲進行瀏覽,對數據庫的訪問壓力相對較小,因為微博數據可以通過緩存進行提供。然而,實際上,粉絲們也會發(fā)微博,進行寫入操作,這就會使得數據庫再次成為整個系統(tǒng)的瓶頸。
單一的數據庫難以承受如此巨大的訪問壓力。因此,此時的解決方案是數據庫的讀寫分離。具體而言,這一方案通過數據復制的方式將一個數據庫分為兩個部分:主數據庫和從數據庫。主數據庫主要負責數據的寫操作,所有的寫入操作都會被復制到從數據庫,以確保從數據庫的數據與主數據庫保持一致。而從數據庫則主要負責處理數據的讀取操作。這種方式有效減輕了主數據庫的負擔,提高了整個系統(tǒng)的性能和可擴展性。
圖片
通過這種方式,將一臺數據庫服務器水平擴展為兩臺數據庫服務器,可以顯著提升數據處理能力。對于大多數互聯(lián)網應用而言,這種分布式架構已經能夠有效滿足用戶的并發(fā)訪問壓力。然而,對于更大規(guī)模的互聯(lián)網應用,如新浪微博,還需要解決海量數據的存儲與查詢問題,以及由此產生的網絡帶寬壓力和訪問延遲等挑戰(zhàn)。
隨著業(yè)務的不斷復雜化,系統(tǒng)的低耦合與模塊化開發(fā)、部署也成為重要的技術難題。海量數據的存儲主要通過分布式數據庫、分布式文件系統(tǒng)和NoSQL 數據庫來解決。僅僅在傳統(tǒng)數據庫上進行查詢已無法滿足這些數據的性能要求,因此需要部署獨立的搜索引擎來提供高效的查詢服務。同時,為了減輕數據中心的網絡帶寬壓力并提升用戶訪問速度,可以利用CDN和反向代理提供前置緩存,從而快速返回靜態(tài)文件資源給用戶。
為了使各個子系統(tǒng)更加靈活且易于擴展,采用分布式消息隊列來解耦相關子系統(tǒng),通過消息的發(fā)布與訂閱實現子系統(tǒng)間的協(xié)作。此外,應用微服務架構將邏輯上獨立的模塊在物理上也進行獨立部署和維護,系統(tǒng)通過組合多個微服務來完成業(yè)務邏輯,從而實現更高級別的模塊復用,促進系統(tǒng)的快速開發(fā)與維護。
圖片
微服務、消息隊列、NoSQL 等分布式技術在早期出現時,通常具有較高的技術難度和使用門檻,因此僅在一些大規(guī)模的互聯(lián)網系統(tǒng)中得到應用。然而,近年來隨著技術的不斷成熟,尤其是云計算的普及,這些技術的使用門檻逐漸降低。如今,許多中小規(guī)模的系統(tǒng)也開始廣泛采用這些分布式技術架構來設計和構建自己的互聯(lián)網應用。