01

分散式系統是什麼:三個讓它與眾不同的特性

一群電腦,只靠傳訊息合作——從這句簡單定義,會必然長出三個貫穿全書的「物理定律」

先把定義釘死:只能「傳訊息」,不能「共用記憶體」

你的筆電裡好幾個程式同時在跑,彼此靠共享記憶體互通有無——這不算分散式系統。課本給的定義很樸素:分散式系統是指,位於網路上不同電腦的元件,只能靠傳遞訊息(message passing)來溝通與協調動作的系統。

這些電腦可能在同一個房間,也可能在不同大陸——距離不是重點,重點是它們沒有共享的記憶體、沒有共享的時鐘,要合作就只能把資料打包成訊息,丟到網路上送給對方。

🥾
先給你一個畫面:分散在各山頭的登山隊

想像一支登山隊,隊員散在不同山頭,彼此看不到對方,只能靠對講機(傳訊息)聯絡——這正是分散式系統。如果全隊綁在一條繩子上、肩並肩走(單機、共享記憶體),大部分麻煩根本不存在。一旦「散開、只能喊話」,麻煩就全來了。

從這句簡單定義,會必然推導出三個重要特性——它們不是缺點清單,而是這類系統的「物理定律」,後面所有章節都在處理它們帶來的後果。

直接讀原文,旁邊就是白話

這是本章開場對「分散式系統」最直球的定義,附帶三個必然結果。原文放左邊,白話導讀放右邊——不逐句對齊,先讀懂原文的氣口,再看整段在說什麼。

原文 · DSCD Ch.1 A distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messages. Concurrency: In a network of computers, concurrent program execution is the norm. No global clock: …there are limits to the accuracy with which the computers in a network can synchronize their clocks – there is no single global notion of the correct time. Independent failures: Each component of the system can fail independently, leaving the others still running.
白話導讀

這幾句話幾乎是整個學科的起點:分散式系統的元件「只能」靠傳訊息溝通協調——沒有共享記憶體、沒有近路可抄。作者接著指出,這個簡單定義會必然帶來三個後果:一是網路上一堆電腦同時在跑程式是常態(並行);二是電腦彼此的時鐘永遠對不到完全一致,沒有一個放諸四海皆準的「現在幾點」(沒有全域時鐘);三是每個元件都可能各自壞掉,而其他還活著的元件不會馬上知道(獨立失效)。這三點不是三個獨立的巧合,而是「只能傳訊息」這一件事,同時逼出來的三個必然結果。

🔑
記住這句因果鏈

「只能傳訊息」→ 沒有共用時鐘 → 沒有全域時間;「只能傳訊息」→ 偵測不到對方在幹什麼 → 獨立失效。三大特性全部源自同一個限制,不是三件不相干的事。

招牌互動:看三個節點各跑各的,還要協同

下面三個節點各自在忙自己的事。按「下一步」,看看「並行」「沒有全域時鐘」「獨立失效」怎麼在同一個場景裡輪番上演。

🖥️
節點 A
🖥️
節點 B
🖥️
節點 C(中途故障)
按「下一步」開始
📡
A、B 分不清 C 是「壞了」還是「變慢」

節點C故障後,A和B的程式沒辦法立刻判斷:C是當機了?網路斷了?還是只是暫時變慢?這正是獨立失效最麻煩的地方——就像對講機沒電的隊員,他可能還在山上走,只是你聽不到他。

把三大特性定格成一句話

動畫跑太快?這是它的靜態總結——三個從同一個定義長出來的必然特性。

⚙️
並行 Concurrency

網路上一堆電腦同時執行程式是常態,需要時才共享資源。想要更多處理能力?加電腦進來就好——但同時動作就會搶資源,協調並行是反覆出現的主題。

🕒
沒有全域時鐘 No global clock

要合作就要對「事情何時發生」有共識,但網路上的電腦無法把時鐘對得完全一致——沒有一個單一、正確的全域時間。這是「只能傳訊息」的直接後果。

💥
獨立失效 Independent failures

每台電腦、每個程式都可能各自壞掉,而其他元件不會馬上知道。活著的程式甚至分不清對方是壞了,還是只是變慢。

🖥️
還有一個常客:異質性

真實世界裡合作的電腦,往往連硬體、作業系統、程式語言都不一樣,這叫異質電腦(heterogeneous computers)——你不能假設對方跟你長得一樣,這也是後面章節反覆要處理的難題。

動手配配看:哪個案例最能體現哪個特性?

把下面三個真實案例,拖到它「最」能體現的那個特性上。配完按「對答案」。

Google 搜尋引擎
多人線上遊戲
金融交易系統
每月上百億次搜尋,遍佈全球資料中心的大量電腦同時處理請求——並行是常態
拖到這裡
上萬玩家要看到「同一個世界」,玩家一動別人要幾乎同時看到,時間先後的協調特別關鍵
拖到這裡
交易事件要可靠送達每個關注者;任何一個環節斷線或當機,都不能讓整條交易鏈默默出錯
拖到這裡
🎯
這只是「最」明顯的那一個

三大特性其實同時存在每個案例裡——Google 搜尋一樣有節點會故障,遊戲伺服器一樣要並行處理成千上萬玩家。這個練習只是幫你抓住「這個案例最典型在說哪件事」。

同樣是「一群電腦合作」,怕的東西完全不同

課本用三個範例,讓你看到分散式系統的多樣性與規模,而且每個範例都對設計者施加不同的壓力。

網頁搜尋 Web Search

每月超過百億次搜尋,要為上百億個網頁建索引。Google 為此打造了史上最龐大複雜的分散式系統之一:全球資料中心的大量電腦、專為超大檔案優化的分散式檔案系統、鎖服務、超大規模平行運算的程式設計模型。壓力來源:資料量極大、要高速持續讀取

大型多人線上遊戲 MMOGs

上萬名玩家同時沉浸在同一個虛擬世界。反直覺的是,最大的 EVE Online 反而用用戶端-伺服器(client-server),把世界狀態集中管理、依負載把「星系」分配到不同電腦。壓力來源:快速回應與一致的共享世界

金融交易 Financial Trading

強調事件(events)的傳遞與處理:股價下跌、數據發布都是事件,要可靠、即時送給大量關注者。系統用 adapter 把各種格式統一,再用複雜事件處理(CEP)找出交易機會自動下單。壓力來源:異質事件來源與即時樣式偵測

🏛️
去中心化不一定比較好

EVE Online 這個「最大的線上遊戲」,反而選了集中式架構——因為單一份世界狀態更好管理、更容易維持一致,再用「把高負載星系分到專屬電腦」解決效能問題。下次設計系統別急著套流行架構,先問:我最大的壓力是量、是快、還是亂?

小試身手

抓住這三大特性,你就摸到分散式系統的骨架了。來兩題:

一位同事說:「我這台多核心電腦上的程式同時跑好幾個執行緒,靠共享記憶體溝通,所以它是分散式系統。」這個說法為什麼站不住腳?
課本提到最大的線上遊戲 EVE Online 採用集中式 client-server 架構。這個選擇「反直覺」之處與主要好處分別是什麼?
📡
下一站:這些系統是怎麼冒出來的?

先看看是什麼「趨勢」把我們推向這裡。往下捲。

02

推動分散式系統的趨勢:從隨身上網到雲端

網路變得無所不在、裝置變得又小又多——四股力量,把分散式系統從「教科書名詞」推成「你每天的日常」

為什麼是「現在」?

上一站我們認識了分散式系統的樣子。這一站要回答一個更根本的問題:這些系統為什麼會變成今天的規模、長成今天的樣子?書上指出,背後其實是幾股一直在加速的力量在推——

1
普及網路 Pervasive networking

有線、WiFi、行動網路交織成一張無所不在的網,裝置隨時隨地都能連上。

2
行動與無所不在運算

裝置越做越小、越做越便宜,人可以帶著它移動,環境裡也藏著它。

3
多媒體服務需求爆增

大家要看直播、要視訊會議、要即時串流,這對系統提出全新的時間要求。

4
把運算當公用事業

運算資源開始像水電一樣,被當成「用租的、按用量付費」的服務——也就是雲端運算。

📶
先給你一個畫面

你早上出門,手機自動從家裡 WiFi 切到行動網路;到了公司又自動接上公司 WiFi;用手機叫車、開視訊會議、把照片存上雲端相簿——這一整套「無縫」的體驗,正是這四股趨勢加在一起的結果。它們不是各自獨立的技術新聞,而是同一台巨大機器的四個齒輪。

直接讀原文,旁邊就是白話:普及網路

先看書上怎麼描述「現代 Internet」這件事——它的成就不是速度多快,而是把底層一堆不同的技術「藏」起來。

原文 · DSCD Ch.1 The modern Internet is a vast interconnected collection of computer networks of many different types. The design and construction of the Internet communication mechanisms (the Internet protocols) is a major technical achievement, enabling a program running anywhere to address messages to programs anywhere else and abstracting over the myriad of technologies mentioned above. The role of a firewall is to protect an intranet by preventing unauthorized messages from leaving or entering. The intranets are linked together by backbones. A backbone is a network link with a high transmission capacity.
白話導讀

現代 Internet 其實是一大堆不同種類網路(有線、WiFi、行動網路……)硬湊在一起的大雜燴。它真正了不起的地方,是設計出一套共同的 Internet 協定——不管底層是光纖還是衛星訊號,程式完全不用管,訊息照樣送得到。書上把公司或組織自己管的那一塊子網路叫做 intranet,靠 firewall(防火牆) 過濾進出訊息來自保;而串起各個 intranet 的高速幹道,就叫 backbone(骨幹)

📮
生活比喻:萬國通用的郵政系統

世界上有飛機、貨船、卡車、機車快遞——速度和規格全不一樣。但只要信封上貼著標準地址(Internet 協定),郵政系統就能把信從任何角落送到任何角落,你完全不必管中途換了幾種交通工具。intranet 就像一棟有門禁的公司大樓,firewall 是站在門口檢查的警衛,backbone 是城際高速公路,ISP 則是幫你家接上馬路的承包商。

「人在動」跟「裝置藏起來」,是兩件不同的事

裝置越做越小、無線越來越普及,催生出兩個常被搞混、但其實不同的概念:

🧳
行動運算 Mobile computing

使用者在移動中、或到了平常不在的地方,仍能透過隨身裝置存取資源。重點是「人會動,服務要跟著走」。挑戰是連線時有時無、甚至斷線——也就是 斷線操作要處理好。

🏨
無所不在運算 Ubiquitous computing

把許多小而便宜的運算裝置藏進日常環境(家裡、辦公室),小到讓人幾乎察覺不到。重點是「裝置藏在環境裡,人不用特別意識到電腦存在」。

書上舉了一個很真實的情境:一位訪客帶著筆電、手機、數位相機去別家公司開會。同一個人身上,同時跑著三種不同距離、不同技術的無線連線——筆電接上主辦方的 WiFi、手機用行動網路連 Internet、相機則用短距離的個人無線網路直接連會議室印表機。

🖨️
相機直連印表機,靠的是什麼?

相機把照片送去印表機,只需要相機跟印表機之間的無線連線——完全不必繞經整個網路。但問題是:相機怎麼知道「這間陌生會議室裡有一台印表機」?這就需要 服務發現(service discovery),讓裝置和從沒見過的本地服務快速、方便地搭上線——書上稱這種能力為 自發互通(spontaneous interoperation)

招牌互動:手機在網路間漫遊,服務怎麼不中斷?

行動運算最有感的體驗,就是「你根本沒發現網路換過」。按「下一步」,看手機怎麼在 WiFi 熱點、行動基地台、雲端服務之間悄悄切換。

📱
手機
📶
WiFi 熱點
📡
行動基地台
☁️
雲端服務
按「下一步」開始這趟漫遊
🔌
「無縫」背後,是刻意設計的容錯

這種切換看起來理所當然,其實是系統刻意處理了「連線時有時無、甚至斷線」這個行動運算的老問題。手機、基地台、雲端服務三方要協調好,才能讓你完全感覺不到底層換了一條路。

多媒體要「準時」,雲端要「像水電一樣租」

後兩股趨勢,一個管「時間」,一個管「所有權」。先看多媒體:影片、語音這類 連續媒體 跟圖片、文字這類離散媒體完全不同——它的完整性,取決於「準時送達」。

🍣
生活比喻:連續媒體像迴轉壽司的傳送帶

離散媒體(照片、文字)像一張照片,你慢慢看都行,沒有時間壓力。連續媒體(音訊、視訊)像迴轉壽司的傳送帶——影格要以穩定速度準時送到你面前,忽快忽慢畫面就卡頓。「保證準時送達」這件事,就是 服務品質(QoS)。做不到時,系統就得自動降畫質——這叫 適應(adaptation)

另一股趨勢,是把整套分散式運算資源當成 雲端運算(cloud computing) ——就像水電一樣,用租的而不是自己買斷。背後撐起雲端規模的,是一群便宜硬體互連合作的叢集電腦(cluster computer)

📶
普及網路與行動運算

網路無所不在、裝置隨身可連,讓「在路上工作」變成常態,但也帶來斷線與漫遊的挑戰。

🎬
多媒體服務

直播、視訊會議、串流影音要求「準時送達」,逼系統認真規劃服務品質(QoS)與適應策略。

☁️
雲端運算

運算資源變成按用量付費的公用事業,靠虛擬化與叢集電腦彈性供應,不必自己養機房。

🌐
物聯網 IoT

感應器、家電、穿戴裝置大量連上網,把無所不在運算的願景,變成滿街都是的真實產品。

🚰
用自來水想像雲端運算

以前想用運算資源,得自己挖一口井——買伺服器、自己維護、用不用都要養著。雲端運算把運算變成自來水:打開水龍頭(連上服務),用多少算多少錢,不必煩惱水從哪來。虛擬化就像把一條大水管分裝成很多戶人家各自的水表,彈性又好管理。

小試身手

四股趨勢都摸過一輪了。來兩題,檢查你有沒有抓到重點:

下列哪個情境最能體現「無所不在運算(ubiquitous computing)」,而不是單純的「行動運算」?
一個視訊服務在網路壅塞、無法維持原畫質時,自動把畫質降到較低解析度以維持播放順暢。這對應課本提到的哪個策略?
🤝
下一站

這些裝置與服務,到底在共享什麼、又是誰在提供?往下捲,我們把鏡頭轉向「資源共享」這個分散式系統最核心的動機。

03

資源共享:服務、用戶端與伺服器

你每天都在「共享資源」,卻很少想過——資源明明鎖在別台電腦裡,你是怎麼碰到它的?

你以為的「用印表機」,其實是一次跨電腦的協作

印表機、共用檔案、搜尋引擎——你天天在享受這些好處,習慣到幾乎不會多想。但課本第一句話就把話說白了:建構分散式系統,最主要的動機就是 資源共享

但這裡藏著一個很物理的事實:資源不是飄在空中的,它被實體封裝在某一台電腦裡——檔案存在某顆硬碟上,印表機接在某個網路埠上。其他電腦想用它,唯一的辦法就是隔著網路「開口要」。這一模組,就是要把這個「開口要」的過程,拆成精確的詞彙。

硬體資源

印表機、磁碟——共享這些,主要是為了省成本。

資料資源

共用資料庫、一組網頁——使用者真正在意的是資料本身,不是它躺在哪顆硬碟上。

特定功能資源

搜尋引擎、匯率轉換器——使用者只管功能好不好用,不管背後是哪台伺服器在撐。

🖨️
重點不是「省了硬體錢」

共享印表機、磁碟確實省成本,但課本說得很清楚:對使用者而言,真正重要的是共享那些「更高層」的資源——像共用資料庫、搜尋引擎——使用者根本不在乎背後是哪顆磁碟、哪台伺服器在跑。

直接讀原文,旁邊就是白話

這一段是本節對「service / server / client」最精確的定義,一字都不能鬆動。左邊原文、右邊白話導讀——不是逐句對應,是幫你抓住這幾句話在講什麼。

原文 · DSCD Ch.1 We use the term service for a distinct part of a computer system that manages a collection of related resources and presents their functionality to users and applications. The only access we have to the service is via the set of operations that it exports. Resources in a distributed system are physically encapsulated within computers and can only be accessed from other computers by means of communication. It refers to a running program (a process) on a networked computer that accepts requests from programs running on other computers to perform a service and responds appropriately. The requesting processes are referred to as clients, and the overall approach is known as client-server computing. Clients are active (making requests) and servers are passive (only waking up when they receive requests); servers run continuously, whereas clients last only as long as the applications of which they form a part.
白話導讀

這幾句話,是整套 client-server 詞彙的地基:服務(service)是系統裡專門管理一群相關資源、並把功能開放給使用者與應用程式的那個部分——你進不去它的內部,只能透過它公開的那組「操作」跟它互動。

為什麼要這樣限制?書上講得很誠實:資源被實體封裝在某台電腦裡,別的電腦只能靠「通訊」去碰它,這是物理現實逼出來的設計,不是刻意為難你。

於是就有了伺服器(server)——一支在網路電腦上跑、被動等著接請求、做完事再回應的程式;發請求的那一方叫用戶端(client),整套模式就叫 client-server computing。

最容易忽略但最重要的一句:client 是主動的,server 是被動的——server 一直開著待命,client 只在它所屬的應用程式還活著的時候,才存在。

🔑
這句是全模組的鑰匙

「Resources … are physically encapsulated within computers and can only be accessed from other computers by means of communication.」——資源被鎖在電腦裡,通訊是唯一的鑰匙。後面所有的 client、server、remote invocation,都是圍著這句話長出來的。

把服務想成餐廳的點餐窗口

詞彙有點抽象?課本自己給了一個很生活的畫面——想像一間餐廳。

🍳
廚房裡的食材與廚具 = 資源

你不能直接伸手去拿——它們被封裝在廚房裡,就像資源被封裝在某台電腦裡。

🧾
點餐窗口與菜單 = 服務與操作

你只能用菜單上有的選項互動:點餐、加點、退單,但不能說「讓我進廚房自己翻冰箱」。

🙋
你點餐、服務生出餐 = client 與 server

你(client)主動走到窗口點餐;服務生/廚房(server)平常待命,收到點單才動作。

這個比喻還藏著一個容易考的細節:client 與 server 是角色,不是身分。一位服務生對顧客來說是 server,但他轉身向廚房點貨時,他自己又變成廚房的 client——角色只看「這一次互動」,不是看這個人「本來是誰」。

📋
菜單就是介面

你只能點菜單上有的東西,這保證了廚房能可靠、一致地出餐,不會被亂搞。對應到系統裡:操作(operations)就是那張菜單——例如 file service 只開放 read、write、delete,你進不去背後的檔案系統細節。

招牌互動:兩個用戶端,一份資源,一場資源共享

光講定義還是抽象。下面演一次最經典的場景:用戶端 A 先發請求,接著用戶端 B 也想同時用同一份資源——這正是「資源共享」要解決的核心問題。按「下一步」看它怎麼跑。

🙂
用戶端A
🗄️
伺服器
📦
共享資源
🙂
用戶端B
按「下一步」開始這場資源共享
🎯
兩個用戶端同時上門,才是重點

只有一個用戶端時,client-server 看起來很簡單。真正的挑戰,是像剛剛這樣——多個用戶端同時競用同一份資源,伺服器還要保證每個人拿到的結果都正確、一致。這正是「資源共享」這件事之所以需要被認真設計的原因。

服務怎麼安排?主從式 vs 對等式

Client-server 不是唯一的做法。課本舉了大型多人線上遊戲(MMOG)的真實案例:有些遊戲用主從式,有些完全反過來,走 對等式(peer-to-peer) 。點點看兩種安排的特色與取捨:

服務的兩種安排方式
🗄️ 主從式 Client-Server
🕸️ 對等式 Peer-to-Peer
主從式 Client-Server:由一個(或一組)集中的伺服器管理資源的單一版本,眾多用戶端向它發請求。EVE Online 就是這樣——整個遊戲世界的狀態只存一份,放在一個由數百台電腦組成的伺服器叢集上。好處:管理容易、資料只有一份,一致性問題天然好解;付出的代價是伺服器本身要撐住所有負載,得靠切割任務(例如把不同星系分給叢集裡不同電腦)來擴充。
⚖️
沒有絕對的贏家,只有取捨

多數商業系統還是選主從式或它的變體(例如把世界拆給多台地理分散的伺服器,像 EverQuest 那樣依使用量動態分配用戶端)。對等式更前衛,但代價是協調變複雜——這就是分散式系統設計裡反覆出現的權衡:集中好管理,分散好擴充

你天天都在用的 client-server:瀏覽器

不必舉多複雜的例子——你現在看這頁教材用的瀏覽器,本身就是一個 用戶端(client) 。它向 web server 請求網頁,這正是最常見的 client-server 案例,也是下一章要細看的 WWW 案例的核心骨架。

把這套詞彙用在分析任何系統上,課本給了一份實務檢核清單,拿到任何系統先問三題:

1
誰主動、誰待命?

找出誰是 client(發請求)、誰是 server(收到才醒來回應)。

2
介面開放哪些操作?

這個服務對外公開哪些明確操作?哪些細節被刻意封裝、你碰不到?

3
有沒有元件身兼兩角?

web server 對瀏覽器是 server,但它去查資料庫時,自己又變成 client。

🌐
角色會沿著呼叫鏈一路切換

在物件導向的分散式系統裡,資源常封裝成 物件(object) ,這時我們說 client object 對 server object 呼叫「方法(method)」。分析一條請求鏈時,記得逐次請求判斷角色——同一支程式,可能在鏈的這一端是 server,換到下一端就變成 client。

小試身手

把 service、client、server、remote invocation 這串詞彙串起來,你就掌握了本章最基本也最常用的骨架。來兩題:

課本強調服務只透過「一組明確操作(如 read、write、delete)」開放資源。這個限制同時反映了哪兩件事?
一個 web server 在回應瀏覽器請求的同時,自己也去向資料庫查詢資料。關於它的角色,下列敘述何者正確?
🧩
下一站:八個難題

資源共享聽起來簡單,但要做對,得同時扛住八個難題。往下捲,我們把它們一個一個攤開來看。

04

設計上的八大挑戰:讓「看起來簡單」撐住背後的複雜

你點一下滑鼠、寄一封信、看一段視訊——背後其實是八道題目同時被解開

分散式系統的「甜」,藏著八根刺

前面幾個模組都在講分散式系統多好——資源共享、平行運算、隨處連線。但天下沒有白吃的午餐:把一堆各不相同的電腦、網路、程式湊在一起共事,注定會撞上一整組麻煩。書上把這些麻煩歸納成八個挑戰,這個模組先解第一、二個。

第一個挑戰是 異質性 Heterogeneity ——說白了就是「大家都不一樣」。它出現在五個層面:網路(Ethernet、WiFi……)、電腦硬體(例如整數的位元組順序就有兩種寫法)、作業系統(UNIX 與 Windows 收發訊息的 API 不同)、程式語言(字元、陣列、紀錄的表示法各異),還有不同開發者各自的實作——沒有共同標準就無法互通。

1
共同標準

例如所有連上 Internet 的電腦都講 Internet 協定,網路的差異就被抹平了。

2
中介軟體 Middleware

一層軟體,提供統一的程式設計抽象,同時把底層網路、硬體、OS、語言的差異都遮蔽起來。像 CORBA、Java RMI。

3
虛擬機器

行動程式碼(如 JavaScript)本來綁死特定指令集與 OS;編譯成 bytecode 交給 JVM 解譯,每種電腦只要實作一次 JVM 就通。

🎧
同步口譯耳機

聯合國裡各國代表講不同語言,彼此根本聽不懂——但只要戴上同步口譯耳機,講英文的、講法文的都能順暢開會。耳機遮蔽了語言差異,還提供了統一的「開會方式」。這正是中介軟體在分散式系統裡做的事。

直接讀原文,旁邊就是白話

這幾句是本章對「異質性」與「開放性」最直接的定義。左邊原文、右邊白話導讀——不逐句對齊,先抓住意思就好。

原文 · DSCD Ch.1 The Internet enables users to access services and run applications over a heterogeneous collection of computers and networks. The term middleware applies to a software layer that provides a programming abstraction as well as masking the heterogeneity of the underlying networks, hardware, operating systems and programming languages. The openness of a computer system is the characteristic that determines whether the system can be extended and reimplemented in various ways. Openness cannot be achieved unless the specification and documentation of the key software interfaces of the components of a system are made available to software developers. In a word, the key interfaces are published.
白話導讀

Internet 讓使用者能跨越一整堆「彼此不一樣」的電腦與網路,照樣存取服務、跑應用程式——這就是異質性的日常戰場。中介軟體的角色,就是站在應用程式和底層之間,一邊給你一套統一好用的介面,一邊把下面網路、硬體、作業系統、程式語言的差異全部吸收掉,讓寫應用的人不必操心「對方到底是什麼機器」。

另一個挑戰是開放性:一個系統夠不夠開放,看的是它能不能被別人擴充、被重新實作。而開放的先決條件很直白——把關鍵軟體介面的規格和文件公開出來,讓所有開發者都能拿到。書上一句話說得乾脆:簡單講,就是把關鍵介面「公開(published)」。

🧱
樂高的凸點規格

樂高能無限擴充,是因為它的凸點規格是公開的——任何廠商照規格做積木,都能拼進現有的城堡。你不會被單一廠商綁死。但前提是每塊積木都得真的符合規格,否則拼不起來。開放系統也一樣:介面公開了,元件還是得經過測試,確認真的遵守標準。

第三、四關:東西別被看走、別被擠垮

分散式系統裡流動的資訊往往很值錢,安全性 Security 因此至關重要,通常拆成三要素——機密性 Confidentiality(防洩漏給未授權者)、完整性 Integrity(防竄改)、可用性 Availability(防止存取手段被干擾)。這三者多半能靠加密技術解決,但還有兩個尚未完全解決的難題:

阻斷服務攻擊 DoS

用海量無意義請求灌爆服務,讓正常使用者進不來。目前多半只能靠事後抓人懲處,並非根本解法。

行動程式碼的風險

收到的執行檔(像 email 附件)可能表面上是張有趣圖片,實際卻在偷存取本機資源,甚至參與 DoS 攻擊。

第四關是 可擴展性 Scalability ——系統在資源數與使用者暴增時,還能不能維持有效運作。設計時要控制實體資源成本(n 個使用者的資源量最好是 O(n),跟人數成正比)、控制效能損失(階層式結構比線性結構好,存取時間 O(log n))、防止軟體資源耗盡(例如 32 位元 IP 位址不夠用只好換成 128 位元的 IPv6),還要避免效能瓶頸——演算法應該去中心化,例如 DNS 把名稱表分割給各地伺服器在地管理,取代了早期單一主檔的瓶頸;熱門資源則可靠快取與複製分流。

🏦
DoS 像擠爆銀行大門

一群人故意擠爆銀行大門,讓真正要辦事的客戶進不去——你很難只靠「門口檢查」擋掉,因為他們看起來都像顧客。可擴展性則像連鎖店展店:客人加倍,分店數大致也加倍就好;別讓全國訂位都打到同一支總機,改成各分店自己接訂位;招牌菜先備好放在每家分店,省得每次都跑回中央廚房。

招牌總覽:設計分散式系統的八大挑戰

把前面兩關和接下來要講的四關,一次攤開放在桌上。這八張卡,就是整本書後面所有章節反覆回頭解的題目:

🧩
異質性 Heterogeneity

網路、硬體、OS、語言、不同人的實作,通通不一樣——靠共同標準與中介軟體弭平差異。

🔓
開放性 Openness

關鍵介面公開,系統才能被擴充、被不同人重新實作,不被單一廠商綁死。

🔒
安全性 Security

機密性、完整性、可用性三要素,再加身分辨識;DoS 與行動程式碼仍是未解難題。

📈
可擴展性 Scalability

使用者與資源暴增時仍要維持效能——靠去中心化、階層化、快取與複製分流。

🚑
錯誤處理 Failure handling

部分失效難以偵測——用偵測、遮蔽、容忍、復原、冗餘五招撐住可用性。

🔀
並行性 Concurrency

多個 client 同時碰同一份共享資源,沒同步就會交錯出錯——共享物件必須自己保正確。

🫥
透通性 Transparency

把「元件分散」的事實藏起來,讓系統看起來像一個整體,使用者不必知道細節。

🎯
服務品質 QoS

有功能還要有品質——尤其是準時性,靠事先保留資源來保證時限。

💡
這八張卡不是各自獨立的

它們會互相拉扯——為了可擴展性用了複製,就得處理「使用者不該察覺有幾份副本」的透通性;為了容錯用了冗餘,又牽動並行的同步問題。設計分散式系統,就是在這八根柱子之間找平衡。

第五、六關:有些東西壞了,但你分不清楚

分散式系統的失效很特別——是 部分失效 Partial failure :有些元件壞了,其他還在跑,這讓處理特別困難。書上給了五招對付它:

1
偵測

有些失效能偵測(checksum 抓出損壞資料),有些(像遠端伺服器當機)難以偵測——挑戰是「懷疑卻無法確定」時還能撐住。

2
遮蔽

把已偵測到的失效藏起來或減輕,例如訊息沒到就重傳、資料同時寫到兩顆硬碟。但不保證最壞情況下有效。

3
容忍

有些失效乾脆讓 client 承受。瀏覽器連不到伺服器不會讓你永遠空等,而是告知問題、讓你稍後再試。

4
復原

設計軟體讓當機後資料能回復,或「回滾」到一致狀態。

5
冗餘

用備援元件容錯——路由間至少兩條路徑、名稱表至少複製兩份、資料庫複製到多台。

第六關是 並行性 Concurrency 。多個 client 可能同時存取共享資源;一次只處理一個請求吞吐量太低,於是通常允許並行處理——但若多個執行緒在同一物件內未受控地交錯操作,就會出錯(書上的拍賣例子:兩筆出價交錯後金額被張冠李戴)。書上講得很直接:任何代表共享資源的物件,都必須負責在並行環境下仍正確運作,做法是把操作「同步」,例如用 semaphore 之類的技術。

🏢
請假的會計部

單機程式壞了像一個人感冒全身癱瘓;分散式系統像一間公司,會計部請假,業務部照常上班——這是部分失效。麻煩的是,你打電話到會計部沒人接,分不清是請假還是只是去洗手間,這正是難以偵測的失效。並行問題則像大家搶寫同一塊白板:兩人同時改同一行字,沒人協調,最後就是東拼西湊的錯字——解法是裝一支白板筆,誰拿到筆才能寫。

動手配配看:透通性的四個子類型

第七關 透通性 Transparency 就像一位隱形管家:你說「幫我拿那份檔案」,管家自己跑去不知哪個房間拿來,你完全不必知道它放哪、是不是有副本、中途有沒有出小狀況。RM-ODP 定義了八種透通性,這裡挑四種最常被搞混的,把情境描述拖到它對應的透通性上:

存取透通 Access
位置透通 Location
失效透通 Failure
複製透通 Replication
用同一套操作方式,就能存取本機或遠端的資源——例如一個檔案 API,本地檔案和遠端檔案用的是同一組指令
拖到這裡
使用者不需知道資源實際放在哪一棟建築、哪個網路位置,就能存取它
拖到這裡
把硬體或軟體元件的故障隱藏起來,讓使用者與應用程式即使遇到失效,仍能完成任務——例如 email 會一直重試直到送達
拖到這裡
同一份資源可以有多個副本以提升可靠性與效能,但使用者與程式設計師完全不必知道有幾份副本
拖到這裡
🌐
網路透通性:最重要的兩種

存取透通與位置透通,合稱網路透通性——書上點名這兩種對「分散式資源到底有沒有被好好利用」影響最大。寄一封 email,你不必知道對方實體位置在哪(位置透通),也用同一套「寄信」動作完成(存取透通);就算對方一時收不到,系統也會重試到送達為止(失效透通)。

最後一關,加上小試身手

第八關是 服務品質 QoS 。有了功能還要問品質——主要的非功能性質是可靠性、安全性、效能,再加適應性。QoS 後來特指系統滿足時限保證的能力,例如準時顯示每一幀視訊。要做到這點,關鍵資源必須被「保留」,由資源管理者提供保證;無法滿足的保留請求則會被拒絕。

🎉
預約餐廳包廂

你要辦一場準時開始的活動,不能「有空位再說」,得事先預訂包廂與人手,餐廳才能保證準時上菜;若資源被訂滿,預約直接被拒絕,而不是讓你到場撲空。這就是 QoS 用「保留資源」換「時限保證」的邏輯。

八個挑戰講完了,來驗收兩題:

一個系統要讓「C++ 寫的伺服器」與「Java 寫的用戶端」在不同硬體上互通。中介軟體在此最主要的貢獻是什麼?
拍賣系統中兩筆出價「Smith: $122」與「Jones: $111」在未受控交錯下,被存成「Smith: $111」「Jones: $122」。這是什麼問題?該怎麼解?
🌍
下一站:全球資訊網

下一站:把整章打包,看一個真實系統怎麼同時扛住這八個挑戰——全球資訊網。

05

案例研究:全球資訊網——活生生的分散式系統

你天天在用的網頁,正是這一章講的所有觀念的縮影——資源共享、client-server、開放系統,全部藏在一個網址裡

整章講的東西,其實你每天都在用

前面幾格談了資源共享、client-server、開放系統這些聽起來有點抽象的概念。現在課本挑了一個你我每天都在碰的東西來當範例—— 全球資訊網(World Wide Web)

Web 誕生於 1989 年的 CERN(歐洲核子研究中心),一開始只是物理學家之間交換文件的小工具。它的關鍵特色是 超文本(hypertext) 結構:文件裡藏著一個個連結,指向別的文件或資源,於是全世界的文件被織成一張「連結之網」——這就是「World Wide」的來源。

🕸️
Web 是「開放系統」的活教材

還記得前面提過的開放系統嗎?Web 開放在兩個地方:一是它建立在自由公開、大家都能實作的標準上(任何符合標準的瀏覽器都能跟任何符合標準的伺服器溝通);二是它對「可發布的資源類型」保持開放——誰發明了新格式,馬上就能發布上網,瀏覽器再靠外掛去支援顯示。這正是它能一路長成今天規模的原因。

直接讀原文,旁邊就是白話

這一段是課本介紹 Web 起源與本質的原話。左邊原文、右邊白話導讀——你看得懂大意,也順手練了原文。

原文 · DSCD Ch.1 The World Wide Web is an evolving system for publishing and accessing resources and services across the Internet. The Web began life at the European centre for nuclear research (CERN), Switzerland, in 1989 as a vehicle for exchanging documents between a community of physicists connected by the Internet. A key feature of the Web is that it provides a hypertext structure among the documents that it stores, reflecting the users' requirement to organize their knowledge. The Web is an open system: it can be extended and implemented in new ways without disturbing its existing functionality.
白話導讀

這幾句話講的是 Web 的「出身」跟「本質」:它不是憑空掉下來的完美設計,而是從一群物理學家想互相交換文件的小需求,一路演化長大的系統。課本特別強調它「持續演化(evolving)」——不是一次到位,是邊用邊長。

而它之所以能長這麼大,關鍵就在超文本結構:文件之間彼此連結,剛好貼合人腦組織知識的方式(想到一件事,順手就連到相關的另一件事)。加上它從骨子裡就是開放系統——新東西隨時能加進來,舊功能不會被打壞——這才撐得起後來三十幾年的爆炸性成長。

💡
「演化」不是意外,是設計

Web 從 1989 年到今天長這麼大,靠的不是運氣,而是它一開始就選對了架構——開放標準+簡單協定+超文本。這正是這一章想告訴你的:好的分散式系統設計,會讓「演化」變得可能。

招牌互動:把一個網址拆開來看

Web 的基本架構從沒大改過,一直立在三根柱子上:HTMLURLHTTP。其中 URL 最值得拆開來看——每一段都有自己的任務。點點看下面每一段:

把 http://www.example.com:443/articles?id=42 拆成零件
🔗 scheme(https)
🖥️ host(www.example.com)
🚪 port(443,常省略)
📁 path(/articles)
🔍 query(?id=42)
scheme(https):宣告這個 URL 是哪種類型、要用哪種協定去存取。像決定『用走路、坐船還是寄信』——http/https 是最常見的,其他還有 ftp、mailto、tel。URL 對資源類型保持開放,就是靠這個 scheme 欄位:誰發明新協定,直接定義一個新 scheme 就能用。
🏠
用門牌地址記住 URL 結構

scheme 是「用哪種交通方式」(走路/坐船/寄信);servername 是「哪一棟樓」;path 是「樓裡哪個房間」;如果網址還有 #fragment,那是「房間裡的哪一頁」——由瀏覽器把整份文件下載回來之後,自己在裡面找到那一段。

跑一次完整的網頁請求,看資料怎麼跑

你在網址列打下一個網址、按下 Enter,短短幾百毫秒內,背後其實跑了好幾趟來回。按「下一步」,看三個角色怎麼合作:

🌐
瀏覽器
📇
DNS
🗄️
Web 伺服器
按「下一步」開始這趟往返
🍱
靜態 vs 動態:超商貨架 vs 現點現做

靜態網頁像超商貨架上已經做好的便當——你拿了就走,每個人拿到的都一樣(伺服器單純讀檔案)。動態網頁像餐廳現點現做——你填了表單,伺服器上的 CGI 程式 依你的輸入現場做一份給你。妙的是,你(瀏覽器)拿到內容時根本分不出是貨架拿的還是現做的——課本管這個叫「透通(transparent)」:瀏覽器不知道也不在乎內容究竟是讀檔案還是程式現場生出來的。

當瀏覽器不夠用:把程式碼帶回家,讓程式也能當客人

Web 一開始是「人用瀏覽器看文件」,但很快就不夠用了。課本接著談了兩個延伸方向:

把程式碼下載到瀏覽器裡跑

JavaScript 能在你打字時就即時檢查輸入格式,還能只更新網頁的一角,不必整頁重抓——這種「資料到達跟你的動作不同步」的更新方式叫 AJAX(非同步)。 早期還有用 Java 寫、由瀏覽器自動下載執行的 applet。

🤝
讓「程式」也能當 Web 的客人

HTML 是設計給人看的,並不適合程式跟程式互通。於是有了 XML ——標準、結構化、自我描述,讓不同機器都能讀懂彼此傳的資料,這正是Web Services的基礎。

那 Web Services 要怎麼設計介面?課本點名了 REST 這個架構風格:每個資源都有自己的 URL,而且都回應同一組標準操作——GET 讀取、POST 新增、PUT 更新、DELETE 刪除。

🔌
REST 像每個房間都用同一款萬用插座

每個資源都有自己的地址(URL),而且都接受同一組標準操作,誰來都能插,超好擴充——這正是它換來的擴展性。代價是規範相對鬆散,實際運作時較不嚴謹,得靠額外文件把每個操作的細節說清楚。

Web 為什麼能長這麼大?順手驗收一下

課本歸納 Web 成功的三個原因:發布資源很容易、超文本結構適合組織各種資訊、系統架構夠開放——而且背後的標準夠簡單,又早早就公開了。這三點值得你設計任何長久平台時,當作黃金範本。

但成功背後也有代價:資源被搬走或刪除,連到它的連結就變成「斷鏈(dangling link)」;使用者也常在滿地連結裡「迷失在超空間」,得靠搜尋引擎來補救。天下沒有零缺點的設計,只有取捨。

課本特別強調「只有瀏覽器(不是伺服器)會解讀 HTML,伺服器只負責告知內容類型」。這個分工帶來的好處是什麼?
課本說「靜態檔案內容與動態產生的內容,對瀏覽器是透通的」。這句話的意思是?
🌐
Web 就是這一整章的縮影

回頭看看:Web 同時體現了本章開頭談的資源共享(全世界的文件、服務彼此開放存取)、client-server(瀏覽器對伺服器一問一答),也一路示範了三大特性——開放性、並行性、容錯性如何在真實系統裡落地;而它從斷鏈、迷失在超空間到擴展性壓力,其實都是那八大挑戰的具體現身。這正是這一章想教你的:學會「辨認」——下次遇到任何一個分散式系統,你都能認出這些同樣的骨架。

📚
這一站,也是整章的終點

第一章到這裡就告一段落了:從「什麼是分散式系統」出發,走過資源共享、三大特性、八大挑戰,最後用你我每天都在用的 Web 收尾——把抽象的原則,釘進一個具體又熟悉的例子裡。準備好,翻到下一章,繼續往下深挖分散式系統的設計細節。