索引 / 001 ZH-TW
Understanding Distributed Systems: What Every Developer Should Know About Large Distributed Applications(理解分散式系統:開發者應知的大型分散式應用) cover

電腦科學

電腦科學

Understanding Distributed Systems: What Every Developer Should Know About Large Distributed Applications(理解分散式系統:開發者應知的大型分散式應用)

Roberto Vitillo

英文原名: Understanding Distributed Systems: What Every Developer Should Know About Large Distributed Applications

一本寫給開發或維運網路應用程式之開發者的精簡分散式系統入門書。書中說明軟體在多台機器上執行時會遇到的核心問題,例如通訊、協調、擴展與韌性,並將成熟的理論與大型雲端服務所採用的實務模式連結起來。

需要的基礎: 具備程式設計經驗,並對網頁應用程式與網路的運作有基本了解;不需要修過分散式系統課程。

難度等級
入門
學術層次
大學部
distributed systemsscalabilityreplicationfault tolerancecloud computing

01 / 導讀

導讀

引用

Vitillo, R. (2022). Understanding Distributed Systems: What Every Developer Should Know About Large Distributed Applications (2nd ed.). Roberto Vitillo.

章節概要

第二版(2.0.0版,2022年3月)約330頁,共34章:一個引言、五個部分(通訊、協調、可擴展性、彈性和可維護性)以及一個簡短的結語章。前言稱第二版是對第一版的全面重寫。各章篇幅緊湊,不少只有幾頁,並在腳註中列出論文、RFC和工程文章,供想深入瞭解的讀者參考;書中沒有習題。

第1章:引言

把分散式系統定義為透過交換訊息進行協作的一組節點,解釋為什麼要構建這類系統(應用本身就是分散式的、可用性、單臺機器容納不下的負載、延遲),並預告為五個部分命名的五大挑戰。本章用「兩將軍問題」說明協調為何困難,並介紹吞吐量、響應時間、縱向擴展與橫向擴展,以及用「幾個9」來衡量的可用性。最後一節從業務邏輯、介面和轉接器的角度描述服務的構成(連接埠與轉接器架構)。

第一部分 第2–5章:可靠鏈路;安全鏈路;服務發現;API

第一部分逐層搭建分散式應用所依賴的網路協定棧。第2章說明TCP如何在IP之上建立可靠通道:區段與確認、連線的生命週期與三次握手、流量控制、擁塞控制,以及自訂協定。第3章說明TLS如何在TCP之上加入加密、認證、完整性和握手。第4章把DNS介紹為一個分散式、分層且最終一致的鍵值儲存,這是讀者第一次接觸最終一致性。第5章講解RESTful HTTP API:資源、請求方法、狀態碼、OpenAPI、API演進和冪等性。

第二部分 第6–13章:系統模型;故障檢測;時間;領導者選舉;複製;避免協調;交易;非同步交易

作者稱這是全書理論最多、難度最大的部分。本部分先介紹關於行程、鏈路和時序的系統模型,然後討論故障檢測。第8章講物理時鐘、邏輯時鐘和向量時鐘;第9章講Raft領導者選舉及實際考量。第10章討論狀態機複製、共識、一致性模型(包括CAP和PACELC所體現的權衡)以及鏈式複製。第11章轉向避免協調的較弱模型:廣播協定、無衝突複製資料型態(CRDT)、Dynamo風格的資料儲存、CALM定理和因果一致性。第12和13章討論跨分區或跨服務的交易:ACID、隔離性、原子性、NewSQL系統,以及用於長時間執行的非同步交易的發件箱模式和Saga。

第三部分 第14–23章:HTTP快取;內容傳遞網路;分區;檔案儲存;網路負載平衡;資料儲存;快取;微服務;控制平面與資料平面;訊息傳遞

第三部分跟隨一個簡單的CRUD網路應用逐步擴展的過程,並圍繞三種模式組織內容:功能分解、分區和複製。內容從客戶端HTTP快取和反向代理開始,經過CDN、範圍分區與雜湊分區、Blob儲存(以Azure Storage的架構為例),再到基於DNS、傳輸層和應用層的負載平衡。第19章透過複製和分區來擴展關係型資料庫,隨後介紹NoSQL儲存;第20章討論快取策略以及本地快取與外部快取。最後三章討論微服務與API閘道器、控制平面與資料平面的分離(含一小節控制理論),以及非同步訊息傳遞,包括投遞保證、恰好一次處理、故障和積壓。

第四部分 第24–28章:常見故障原因;冗餘;故障隔離;下游彈性;上游彈性

第四部分從常見故障原因的清單開始:硬體故障、錯誤處理不當、配置變更、單點故障、網路故障、資源洩漏、負載壓力和級聯故障,並有一節討論風險管理。隨後說明為什麼只有在故障互不相關時冗餘才有用,如何用洗牌分片和蜂窩架構隔離故障,以及容忍下游依賴故障的模式(超時、重試、斷路器)和保護服務免於過載的模式(負載削減、負載平滑、限流、恆定工作量)。

第五部分 第29–33章:測試;持續交付與部署;監控;可觀測性;可管理性

最後一部分討論生產環境中的系統運維。第29章討論測試的範圍和規模,並簡要介紹形式化驗證。第30章跟隨一次變更經過評審、構建、預生產和生產階段,直到回滾。第31章討論指標、服務級別指標與目標、告警、儀表板和輪值待命;第32章透過日誌和追蹤講解可觀測性;第33章討論如何透過配置而不是修改程式碼來改變系統行為。

第34章:結語

一個簡短的結束章。

核心概念

第1–5章:引言與通訊

  • 抽象洩漏:本書講解TCP、TLS和DNS的原因:網路庫會隱藏底層細節,直到出現問題為止。
  • 冪等性:設計API操作,使重試請求不會導致操作被執行兩次。
  • 最終一致性:副本可能暫時不一致,但最終會收斂;讀者首先透過DNS接觸到它。

第6–13章:協調

  • 系統模型:關於行程故障、鏈路可靠性和時序的一組假設,用於對演算法進行推理。
  • 邏輯時鐘與向量時鐘:不依賴同步物理時鐘而為事件排序的方法。
  • 共識與狀態機複製:讓各副本對同一操作序列保持一致,書中以Raft為例說明。
  • Saga:由帶補償操作的本地步驟組成的長時間交易,用來代替分散式加鎖。

第14–23章:可擴展性

  • 分區:按鍵的範圍或雜湊拆分資料,以便分佈到多個節點上。
  • 控制平面與資料平面:把配置和後設資料的管理與請求的處理分離開來。
  • 恰好一次處理:訊息系統在訊息投遞方面能保證什麼、不能保證什麼。

第24–33章:彈性與可維護性

  • 相關故障:具有共同原因的故障,會使簡單的冗餘失效。
  • 斷路器:停止呼叫出故障的依賴,防止故障級聯擴散。
  • 服務級別目標(SLO):為服務級別指標設定的目標值,用來界定可接受的行為。

評析

優點

  • 填補理論與實踐之間的空白。 前言指出,這一領域的資料大多集中在學術或實踐的兩端;本書有意把兩者結合起來,因此Raft、CRDT和CALM定理與CDN、負載平衡器和輪值待命實踐並列出現。本書網站引用了Gergely Orosz的評價,他認為本書填補了深奧理論書與面試準備類書籍之間的空白。
  • 源自生產環境的經驗。 作者曾在Mozilla和微軟(後來在AWS)從事大規模資料平臺工作,這在第三至第五部分體現得很明顯,這些部分涵蓋了經典教材較少涉及的話題:限流、洗牌分片、蜂窩架構、部署流水線、SLO和可觀測性。
  • 簡短而連貫。 用大約330頁覆蓋整個領域,每個部分開頭都有各章概覽,後面的章節也會回扣前文(例如從TCP流量控制聯繫到服務層面的限流)。作者網站上的免費樣章包含前置部分、完整目錄和開頭幾章,讀者可以在購買前瞭解文風。

局限

  • 有意重廣度而輕深度。 前言明確表示,構建大型系統經驗豐富的讀者可能會覺得本書不夠深入;許多章節只有幾頁,演算法用文字和圖示來解釋,而不是給出證明。
  • 沒有習題或專題。 書中沒有習題,課程需要自行設計實驗。
  • 側重雲和後端。 介紹系統構成的一節說明,本書主要關注實作業務服務的後端應用;目錄中沒有關於平行計算或對等網路系統的章節,若干例子取自特定的雲服務。

在課程中的定位

在本課程書單中,Vitillo這本書是最簡短、最注重實踐的入門讀物。van Steen與Tanenbaum的 Distributed Systems 和Coulouris等人的 Distributed Systems: Concepts and Design 是以原理為先的完整教材,對架構、通訊、命名、協調、一致性、複製、容錯和安全的討論要深入得多;可以先讀Vitillo作為概覽,也可以與其中一本並讀,看看這些原理在雲服務中如何體現。Kleppmann的 Designing Data-Intensive Applications 對資料系統(儲存引擎、複製、分區、流處理)的探討更進一步,是讀完第二、三部分後自然的下一步。

Cachin、Guerraoui和Rodrigues的 Introduction to Reliable and Secure Distributed Programming 對Vitillo在第二部分中非形式化講解的抽象(如系統模型、廣播和共識)給出嚴格的處理。Pacheco和Malensek的 An Introduction to Parallel Programming 涵蓋課程的另一面,即為多核處理器、叢集和GPU編寫平行程式,這是本書沒有涉及的內容。

如何使用本書

本書面向從事或準備從事網頁與行動應用後端開發的開發者。讀者需要有程式設計經驗,並大致瞭解網路應用的工作方式;不要求理論基礎。

  • 概覽通讀: 讀第1章和各部分的引言,一個下午就能對這個領域有整體認識。
  • 分散式系統課程的核心: 第二部分(第6–13章)需要慢慢讀;可以與原理類教材的相應章節配合,並順著腳註中的論文(例如關於Raft或CRDT的論文)深入。
  • 實踐者的核心: 第三和第四部分,建議按順序閱讀,因為可擴展性各章是一步步搭建同一個應用的。
  • 初讀可略: 如果已熟悉TCP、TLS和HTTP,可跳過第一部分;第五部分可以等到參與生產服務時再讀。

由於沒有習題,動手實作一些小版本會很有幫助:例如向量時鐘、帶指數退避和抖動的重試策略,或一個簡單的基於雜湊的分區器。電子版會不定期更新並帶有版本號;作者網站提供免費樣章。