- 分布式架構原理與實踐
- 崔皓
- 4168字
- 2022-09-29 10:23:33
1.4 分布式架構的問題
通過前面的介紹,我們了解到為了解決由業務訪問量增長和并發場景帶來的問題,分布式架構將應用服務部署到了分散的資源上面,從而支持高性能和高可用。我們還從這一過程中總結出了分布式架構的四個特征——分布性、自治性、并行性和全局性,這四個特征密切相關。知道了分布式架構的特征和優勢之后,接下來聚焦分布式架構的問題,例如服務如何拆分、分散的服務如何通信及協同,以及如何處理分布式計算、調度和監控。
1.4.1 分布式架構的邏輯結構圖
分布式架構按照拆分的原則,將應用分配到不同的物理資源上。借助這個思路,我們對分布式架構遇到的問題進行層層剖析,根據四個特征把問題進一步細化,將其拆分成具體的問題。通過為什么、是什么、怎么辦的步驟來掌握分布式結構的核心思想,從而對其進行應用。
既然分布式是從拆分開始的,那我們的問題也從拆分入手。任何一個系統都是為業務服務的,所以首先根據業務特點對應用服務進行拆分,拆分之后會形成一個個服務或者應用。這些服務具有自治性,可以完成自己對應的業務功能,以及擁有單獨的資源。當一個服務需要調用其他服務時,需要考慮服務之間通信的問題。同理,多個服務要完成同一件事時,需要考慮協同問題。當遇到大量任務需要進行大量計算工作的時候,需要多個同樣的服務共同完成。任何應用或者計算架構都需要考慮存儲的問題。實現了對應用與資源的管理和調度,才能實現系統的高性能和可用性。此外,加入指標與監控能夠保證系統正常運行。圖 1-24 將分布式架構需要解決的問題按照順序列舉為如下幾步。
(1) 分布式是用分散的服務和資源代替幾種服務和資源,所以先根據業務進行應用服務拆分。
(2) 由于服務分布在不同的服務器和網絡節點上,所以要解決分布式調用的問題。
(3) 服務能夠互相感知和調用以后,需要共同完成一些任務,這些任務或者共同進行,或者依次進行,因此需要解決分布式協同問題。
(4) 在協同工作時,會遇到大規模計算的情況,需要考慮使用多種分布式計算的算法來應對。
(5) 任何服務的成果都需要保存下來,這就要考慮存儲問題。和服務一樣,存儲的分布式也可以提高存儲的性能和可用性,因此需要考慮分布式存儲的問題。
(6) 所有的服務與存儲都可以看作資源,因此需要考慮分布式資源管理和調度。
(7) 設計分布式架構的目的是實現高性能和可用性。為了達到這個目的,一起來看看高性能與可用性的最佳實踐,例如緩存的應用、請求限流、服務降級等。
(8) 最后,系統上線以后需要對性能指標進行有效的監控才能保證系統穩定運行,此時指標與監控就是我們需要關注的問題。

圖 1-24 分布式架構需解決問題的結構圖
后面我們會根據圖 1-24 中箭頭指示的順序,介紹每個問題的具體內容,并將虛線框的部分補齊,也就是將每個問題細化。
1.4.2 應用服務拆分
分布式架構確實解決了高性能、高可用、可擴展、可伸縮等問題。其自治性特征也讓服務從系統中獨立出來,從業務到技術再到團隊都是獨立的個體。但在分布式架構的實踐過程中,產生了一些爭論和疑惑,例如應用服務如何劃分?劃分以后如何設計?業務的邊界如何定義?應用服務如果拆分得過于細致,就會導致系統架構的復雜度增加,項目難以推進,程序員學習曲線變得陡峭;如果拆分得過于粗曠,又無法達到利用分布式資源完成海量請求以及大規模任務的目的。一般來說,應用服務的劃分都是由項目中的技術或者業務專家憑借經驗進行的。即使有方法論,也是基于經驗而得,究其根本,我們還是不清楚業務的邊界在什么地方。換言之,定義業務的邊界是劃分應用服務的關鍵。說白了,就是先劃分業務,再針對劃分后的業務進行技術實現。
既然技術的實現來源于業務,那么對業務的分析就需要放在第一位。我們可以利用 DDD(Domain-Driven Design,領域驅動設計)的方法定義領域模型,確定業務和應用服務的邊界,最終引導技術的實現。按照 DDD 方法設計出的應用服務符合“高內聚、低耦合”的標準。DDD 是一種專注于復雜領域的設計思想,其圍繞業務概念構建領域模型,并對復雜的業務進行分隔,再對分隔出來的業務與代碼實踐做映射。DDD 并不是架構,而是一種架構設計的方法論,它通過邊界劃分將業務轉化成領域模型,領域模型又形成應用服務的邊界,協助架構落地。
這部分內容如下。
?領域驅動設計的模型結構:包括領域、領域分類、子域、領域事件、聚合、聚合根、實體和值對象的介紹。
?分析業務需求形成應用服務:包括業務場景分析、抽象領域對象、劃定限界上下文。
?領域驅動設計分層架構:包括分層原則、每層內容和特征,以及分層實例。
1.4.3 分布式調用
服務與資源一旦分散開,要想調用就沒有那么簡單了。需要針對不同的用戶請求,找到對應的服務模塊,比如用戶下訂單就需要調用訂單服務。當大量用戶請求相同的服務,又存在多個服務的時候,需要根據資源分布將用戶請求均勻分配到不同服務上去。就好像用戶瀏覽商品時,有多個商品服務可供選擇,那么由其中哪一個提供服務呢?服務之間的調用也是如此,服務如何找到另外一個服務,找到以后通過什么方式調用,都是需要思考的問題。針對調用的問題,在不同架構層面有不同的處理方式:在用戶請求經過互聯網進入應用服務器之前,需要通過負載均衡和反向代理;在內網的應用服務器之間需要 API 網關調用;服務與服務之間可以通過服務注冊中心、消息隊列、遠程調用等方式互相調用。因此可以將分布式調用總結為兩部分,第一部分是感知對方,包括負載均衡、API 網關、服務注冊與發現、消息隊列;第二部分是信息傳遞,包括 RPC、RMI、NIO 通信。
?負載均衡分類:針對接入層硬件和軟件負載均衡的實現原理和算法進行介紹。
?API 網關:介紹 API 網關的技術原理和具體功能,并且通過對比的方式介紹流行的 API 網關。
?服務注冊與發現:介紹相關的原理和概念,以及它與發布/訂閱模式的區別。
?服務間的遠程調用:介紹 RPC 調用過程、RPC 動態代理、RPC 序列化、協議編碼和網絡傳輸,還會介紹 Netty 是如何實現 RPC 的。
1.4.4 分布式協同
分布式協同顧名思義就是大家共同完成一件事,而且是一件大事。在完成這件大事的過程中,難免會遇到很多問題。例如,同時響應多個請求的庫存服務會對同一商品的庫存進行“扣減”,為了保證商品庫存這類臨界資源的訪問獨占性,引入了分布式鎖的概念,讓多個“扣減”請求能夠串行執行。又例如,在用戶進行“下單”操作時,需要將“記錄訂單”(訂單服務)和“扣減庫存”(庫存服務)放在事務中處理,要么兩個操作都完成,要么都不完成。再例如,對商品表做了讀寫分離之后,產生了主從數據庫,當主庫發生故障時,會通過分布式選舉的方式選舉出新的主庫,以替代原來主庫的工作。我們將這些問題歸納為以下幾點。
?分布式系統的特性與互斥問題:集中互斥算法、基于許可的互斥算法、令牌環互斥算法。
?分布式鎖:分布式鎖的由來和定義、緩存實現分布式鎖、ZooKeeper 實現分布式鎖、分段加鎖。
?分布式事務:介紹分布式事務的原理和解決方案。包括 CAP、BASE、ACID 等的原理;DTP 模型;2PC、TCC 方案。
?分布式選舉:介紹分布式選舉的幾種算法,包括 Bully 算法、Raft 算法、ZAB 算法。
?分布式系統的實踐:介紹 ZooKeeper 的基本原理和組件。
1.4.5 分布式計算
在大數據和人工智能時代,有海量的信息需要處理,這些信息會經過層層篩選進入系統,最終形成數據。要想讓數據產生商業價值,就離不開數據模型和計算。針對海量數據的計算,分布式架構通常采用水平擴展的方式來應對挑戰。在不同的計算場景下計算方式會有所不同,計算模式分為兩種:針對批量靜態數據計算的 MapReduce 模式,以及針對動態數據流進行計算的 Stream 模式。我們會展開介紹這兩種模式。
?MapReduce 模式:介紹其特點、工作流程和示例。
?Stream 模式:通過 Storm 的最佳實踐介紹其要素和流程。
1.4.6 分布式存儲
簡單理解,存儲就是數據的持久化。從參與者的角度來看,數據生產者生產出數據,然后將其存儲到媒介上,數據使用者通過數據索引的方式消費數據。從數據類型上來看,數據又分為結構化數據、半結構化數據、非結構化數據。在分布式架構中,會對數據按照規則分片,對于主從數據庫還需要完成數據同步操作。如果要建立一個好的數據存儲方案,需要關注數據均勻性、數據穩定性、節點異構性以及故障隔離幾個方面。因此,我們組織以下內容來講解分布式存儲。
?數據存儲面臨的問題和解決思路:RAID 磁盤陣列。
?分布式存儲概念:分布式存儲的要素和數據類型分類。
?分布式關系數據庫:分表分庫、主從復制、數據擴容。
?分布式緩存:緩存分片算法、Redis 集群方案、緩存節點之間的通信、請求分布式緩存的路由、緩存節點的擴展和收縮、緩存故障的發現和恢復。
1.4.7 分布式資源管理與調度
如果把每個用戶請求都看成系統需要完成的任務,那么分布式架構要做的就是對任務與資源進行匹配。首先,我們會介紹資源調度的過程。然后,通過介紹 Linux Container 讓大家了解資源劃分和調度策略是如何工作的。最后,介紹三類資源調度的架構,以及 Kubernetes 的最佳實踐。具體為如下內容。
?分布式調度的由來與過程。
?資源劃分和調度策略。
?分布式調度架構。
?中心化調度的特點是由一個網絡節點參與資源的管理和調度。
?兩級調度在單體調度的基礎上將資源的管理和調度從一層分成了兩層,分別是資源管理層和任務分配層。
?共享狀態調度,通過共享集群狀態、共享資源狀態和共享任務狀態完成調度工作。
?資源調度的實踐:介紹 Kubernetes 的架構及其各組件的運行原理。
1.4.8 高性能與可用性
高性能和可用性本身就是分布式架構要達成的目的。分布式架構拆分和分而治之的思想也是圍繞著這個目的展開的。這部分主要從緩存、可用性兩個方面展開。在分布式架構的每個層面和角度,都可以利用緩存技術提高系統性能。由于技術使用比較分散,在第 8 章中我們會做一個總結性的描述。對于可用性來說,為了保證系統的正常運行會通過限流、降級、熔斷等手段進行干涉。本部分的結構如下。
?緩存的應用:HTTP 緩存、CDN 緩存、負載均衡緩存、進程內緩存、分布式緩存。
?可用性的策略:請求限流、服務降級、服務熔斷。
1.4.9 指標與監控
判斷一個架構是好是壞時,有兩個參考標準,即性能指標和可用性指標,分布式架構也是如此。性能指標又分為吞吐量、響應時間和完成時間。由于系統的分布性,服務會分布到不同的服務器和網絡節點,因此監控程序需要在不同的服務器和網絡節點上對服務進行監控。在分布式監控中會提到監控系統的分類、分層以及 Zabbix、Prometheus、ELK 的最佳實踐。本部分的結構如下。
?性能指標:延遲、流量、錯誤、飽和度。
?分布式監控系統:創建監控系統的步驟、監控系統的分類、監控系統的分層。
?流行監控系統的最佳實踐:包含 Zabbix、Prometheus。
- JavaScript百煉成仙
- Java 開發從入門到精通(第2版)
- Mastering Adobe Captivate 2017(Fourth Edition)
- JavaScript Unlocked
- Git高手之路
- 實戰低代碼
- Magento 1.8 Development Cookbook
- ADI DSP應用技術集錦
- Yocto for Raspberry Pi
- Spring Boot Cookbook
- Getting Started with NativeScript
- Visual FoxPro程序設計習題集及實驗指導(第四版)
- 領域驅動設計:軟件核心復雜性應對之道(修訂版)
- 深入分布式緩存:從原理到實踐
- Python Interviews