官术网_书友最值得收藏!

2.2 水平擴展

水平擴展是指依靠架構復制服務,并在多個服務器節點上運行多個服務副本的能力。來自客戶端的請求被分布在不同的副本,理論上講,如果有N個服務副本和R個請求,則每個服務器節點處理R/N個請求。這種簡單的策略增加了應用程序的存儲能力和計算能力,從而提升了可擴展性。

要成功擴展應用程序,你的設計中需要具備兩個基本元素。如圖2-2所示,它們分別是:

負載均衡器

所有用戶請求都發送到負載均衡器,由它來決定處理請求的目標服務副本。關于如何選擇目標服務副本,有多種策略,所有策略的核心目的都是讓不同的資源同等繁忙。負載均衡器還負責將來自服務副本的響應轉發回客戶端。大多數負載均衡器都屬于反向代理的互聯網組件(https://oreil.ly/78lLN),它們控制著客戶端請求對服務器資源的訪問。負載均衡器扮演著中介的角色,反向代理為請求添加了額外的網絡跳躍點,它們需要將延遲控制到極低,才能最大限度地減少引入的開銷。有許多現成的負載均衡解決方案以及特定于云提供商的解決方案,我將在第5章中更詳細地介紹它們的特征。

無狀態服務

為了使負載平衡有效并均勻地分發請求,負載均衡器必須可以自由地將來自同一客戶端的連續請求發送到不同的服務實例進行處理。這意味著服務中的API實現不得保留與單個客戶端會話相關聯的任何知識或狀態。當用戶訪問應用程序時,服務會創建一個用戶會話,并在內部管理一個唯一的會話,以識別與該用戶交互的順序并跟蹤會話狀態。一個典型的會話狀態管理例子是購物車。為了有效地使用負載均衡器,代表用戶購物車當前內容的數據必須存儲在某個地方——通常是數據存儲器——任何服務副本接收到請求(作為用戶會話的一部分)時都可以訪問此狀態。如圖2-2所示,上述過程的數據存儲被標記為“會話存儲”。

圖2-2:水平擴展架構

水平擴展很有意思的地方是,理論上,你可以不斷添加新的(虛擬)硬件和服務來處理增加的請求負載,并持續保持低延遲。一旦你看到延遲上升,就部署另一個服務器實例。因為使用的是無狀態服務,擴展過程中無須更改代碼,你只需要為部署的硬件付費,所以這是一種相對便宜的策略。

水平擴展還有另一個極具吸引力的功能:如果其中一項服務副本宕機,那么它正在處理的請求將丟失,而宕機的服務副本不管理會話狀態,請求可以簡單地由客戶端重新發出,發送到其他服務實例進行處理。應用程序對服務軟件和硬件中的故障具有彈性恢復能力,從而提高了應用程序的可用性。

然而,與任何工程解決方案一樣,簡單的水平擴展也有局限性。隨著添加服務實例越來越多,請求處理能力會增長,理論上會無限增長。到了一定階段,現實會讓人清醒,因為單一數據庫提供低延遲查詢響應的能力將會減弱。緩慢的數據庫查詢意味著客戶端的響應時間變長。如果請求的到達速度比處理速度快,一些系統組件會因為資源耗盡而過載和失敗,客戶端便會收到異常和請求超時。從本質上講,數據庫成了性能瓶頸,必須對其進行設計才能進一步擴展應用程序。

主站蜘蛛池模板: 霍林郭勒市| 应城市| 宁河县| 盐边县| 峨眉山市| 乐至县| 当阳市| 湛江市| 威信县| 罗田县| 武城县| 鸡泽县| 四子王旗| 景宁| 城市| 剑阁县| 乐平市| 隆化县| 九寨沟县| 临沭县| 八宿县| 道孚县| 太湖县| 高陵县| 永定县| 灵台县| 淮北市| 华宁县| 且末县| 孙吴县| 旬邑县| 富平县| 外汇| 和平县| 富蕴县| 同仁县| 库伦旗| 双辽市| 上杭县| 依安县| 梨树县|