01

分散式系統是什麼

分散式系統就是『靠傳訊息合作的網路電腦』。由此導出三個逃不掉的特性:並行、沒有全域時鐘、各自獨立失效。

先讀原文開場,旁邊就是白話

這是一本英文書。左邊放原文、右邊放白話導讀——你既讀得懂,也順手碰了原文。

原文 · 分散式系統概論 1 1 CHARACTERIZATION OF DISTRIBUTED SYSTEMS 1. 2 Examples of distributed systems 1. 3 Trends in distributed systems 1. 4 Focus on resource sharing 1.
白話導讀

分散式系統就是『靠傳訊息合作的網路電腦』。由此導出三個逃不掉的特性:並行、沒有全域時鐘、各自獨立失效。

定義與三大特性

分散式系統就是『靠傳訊息合作的網路電腦』。由此導出三個逃不掉的特性:並行、沒有全域時鐘、各自獨立失效。

STEP 1

深度探秘

一句話定義,藏著三個逃不掉的後果

分散式系統到底是什麼

課本給的定義其實很樸素:

分散式系統 (distributed system) 是指:位於網路上不同電腦的硬體或軟體元件,只能靠傳遞訊息 (passing messages) 來溝通與協調動作的系統。

注意「只能靠傳訊息」這幾個字,它是整個學科的關鍵。這些電腦沒有共享的記憶體沒有共享的時鐘,要合作就只能把資料打包成訊息,丟到網路上送給對方。它們可能在同一個房間,也可能在不同大陸。

從這個簡單定義,會必然推導出三個重要特性:

  • 並行 (Concurrency):網路上一堆電腦同時在跑程式是常態。我在我的電腦工作、你在你的工作,需要時才共享網頁或檔案。想要更多處理能力?再加電腦進來就好。但同時動作就會搶資源,於是「協調並行」變成反覆出現的主題。
  • 沒有全域時鐘 (No global clock):要合作就要對「事情何時發生」有共識,但網路上的電腦無法把時鐘對得完全一致,沒有一個單一、正確的全域時間。這直接來自「只能傳訊息」這件事。
  • 獨立失效 (Independent failures):每台電腦、每個程式都可能各自壞掉,而其他元件不會馬上知道。網路斷了、某台當機了,活著的程式甚至分不清對方是壞了還是只是變慢。

這三點不是缺點清單,而是這類系統的『物理定律』,後面所有章節都在處理它們帶來的後果。

💡
關鍵

分散式系統 = 一群只靠傳訊息合作的網路電腦,必然帶來並行、無全域時鐘、獨立失效三大特性。

STEP 2

生活妙喻

一群只能用對講機聯絡的登山隊

把分散式系統想成一支登山隊

想像一支登山隊,隊員分散在不同山頭,彼此看不到對方,只能用對講機 (傳訊息) 聯絡——這正是分散式系統。

  • 並行:每個隊員都在各自路段同時往前走,沒有人需要等別人。要走更快?多派幾個人分頭進行。
  • 沒有全域時鐘:你問「我們三點集合好嗎」,但每個人手錶都有點誤差,對講機講話也有延遲,於是隊伍永遠無法擁有一個完全一致的『現在幾點』
  • 獨立失效:如果有個隊員的對講機沒電了,他其實還在山上走,只是你聽不到他;你無法分辨他是『摔下山了』還是『只是收訊不好』。

對比一下:如果全隊綁在一條繩子上、肩並肩走(共享記憶體的單機程式),這些問題大多不存在。一旦『散開、只能喊話』,麻煩就全來了。這就是為什麼分散式系統這麼有挑戰性。

💡
關鍵

分散式系統像分散山頭、只能用對講機聯絡的登山隊:各走各的、時間對不準、有人失聯你還不知道。

STEP 3

實用超能力

用三大特性當『體檢清單』分析任何系統

拿三大特性去『體檢』你身邊的系統

學會這三點,你就能快速判斷一個系統是不是分散式、會踩哪些坑。試著問三個問題:

  1. 元件是不是只靠傳訊息溝通? 是 → 它就是分散式系統。例如手機 App 與雲端後端、多台網頁伺服器之間。
  2. 會不會有並行衝突? 例如兩個人同時搶最後一張票,系統要避免兩人都買到。
  3. 某個元件壞了,別人會不會誤判? 例如 App 連不到伺服器,要分辨是『伺服器掛了』還是『我網路差』。

以一個訂票網站為例,用清單體檢:

特性 在訂票網站的具體表現 設計上要做什麼
並行 千人同時搶票 加鎖或交易機制,避免重複賣出
無全域時鐘 各伺服器時間略有差 別用『誰時間早』當唯一裁判
獨立失效 付款伺服器突然當機 設計逾時、重試、容錯

下次看到任何網路服務,先用這三題掃一遍,你就抓得到它最可能出事的地方。

💡
關鍵

用『只靠訊息溝通?會不會並行衝突?元件壞了別人會誤判嗎?』三題,就能快速看穿任何分散式系統的風險點。

🔆
生活妙喻:只靠傳訊息溝通 ≈ 分散山頭、只能用對講機聯絡的登山隊

隊員看不到彼此、沒有共用的手錶或公布欄,所有協調都要靠喊話,正如分散式系統沒有共享記憶體、只能傳訊息。

🔆
生活妙喻:獨立失效 ≈ 對講機沒電的隊員

他人其實還在走,只是你聽不到;你無法分辨他是出事了還是收訊不好——這正是分散式系統難以偵測失效的核心。

本節字彙

Distributed System (分散式系統)
位於網路不同電腦上的元件,只靠傳遞訊息來溝通與協調的系統。
🧠 Distributed = 散開的;散開了還要合作,就只能靠喊話 (訊息)。
Concurrency (並行)
多個程式或動作在同一時間各自進行,需要時才共享資源。
🧠 Con (一起) + current (進行中) = 大家一起同時在跑。
Independent failures (獨立失效)
系統中各元件可能各自壞掉,而其他元件不會立刻得知。
🧠 Independent = 各自獨立;壞也壞得『各自』,別人還蒙在鼓裡。
一位同事說:「我這台多核心電腦上的程式同時跑好幾個執行緒,靠共享記憶體溝通,所以它是分散式系統。」根據課本的定義,這個說法為什麼站不住腳?
你的手機 App 連不上伺服器,畫面轉圈圈。這最能體現分散式系統的哪一個特性?
課本說分散式系統『沒有單一、正確的全域時間』。這個限制最根本的來源是什麼?

現實世界的分散式系統

用網頁搜尋、大型多人線上遊戲、金融交易三個例子,感受分散式系統的多樣與規模。

STEP 1

深度探秘

三個經典範例,三種不同的設計壓力

分散式系統長什麼樣

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

1. 網頁搜尋 (Web Search)

每月超過百億次搜尋,要為上百億個網頁建索引。Google 為此打造了史上最龐大複雜的分散式系統之一,重點包括:

  • 遍佈全球資料中心的大量網路電腦
  • 為超大檔案最佳化的分散式檔案系統
  • 提供快速存取的結構化分散儲存系統
  • 提供分散式鎖與一致同意的鎖服務
  • 管理超大規模平行運算的程式設計模型

壓力來源:資料量極大、要高速持續讀取。

2. 大型多人線上遊戲 (MMOGs)

上萬名玩家同時沉浸在同一個虛擬世界。最大的 EVE Online 反而用 client-server,把世界狀態集中在伺服器叢集,再依負載把『星系』分配到不同電腦;EverQuest 則用多伺服器分散架構;學界還在研究 peer-to-peer 的去中心化做法。

壓力來源:快速回應一致的共享世界

3. 金融交易 (Financial Trading)

強調事件 (events) 的傳遞與處理:股價下跌、失業數據發布都是事件,要可靠、即時地送給大量關注者。系統用 adapter 把各種格式 (Reuters、FIX) 轉成共同格式,再用複雜事件處理 (CEP) 找出交易機會自動下單。

壓力來源:異質事件來源即時樣式偵測

💡
關鍵

搜尋拼資料量、遊戲拼即時與一致、金融拼事件處理;同樣是分散式系統,壓力來源各不相同,架構也跟著不同。

STEP 2

生活妙喻

圖書館、線上桌遊、新聞快訊台

用三個生活場景理解三個範例

  • 網頁搜尋 = 一座超大圖書館的編目團隊:書 (網頁) 多到上百億本,還不斷新增。要讓你『搜一個詞就秒回相關書名』,背後得有一支龐大團隊、特製的書架與索引系統日夜整理。重點是『東西太多』。

  • MMOGs = 一場萬人同桌的線上桌遊:所有人要看到同一個棋盤,而且你一動別人馬上看到。為了不卡,主辦方把棋盤分區 (星系) 交給不同桌長 (電腦) 管理;玩家走到哪區就由那桌長負責。重點是『又要快、又要大家看到一致畫面』。

  • 金融交易 = 一間新聞快訊編輯台:四面八方的快訊 (股價、數據) 用不同語言 (格式) 湧進來,編輯台先用翻譯員 (adapter) 統一成同一種語言,再用自動偵測員 (CEP) 盯著『若 A 發生接著 B 發生,就立刻行動』的樣式。重點是『把雜亂事件即時整理成行動』。

同樣是『一群電腦合作』,但圖書館怕的是量、桌遊怕的是慢、快訊台怕的是亂與慢。

💡
關鍵

搜尋像怕東西太多的圖書館、遊戲像要同步畫面的萬人桌遊、金融像把雜亂快訊即時變成行動的編輯台。

STEP 3

實用超能力

先問『主要壓力是什麼』,再選架構

拿到一個系統,先問它『最怕什麼』

這三個範例教我們一個實用思路:架構沒有最好,只有最適合。先辨認主要壓力,再選架構。

主要壓力是『資料量極大、要高速讀』
   → 走分散式儲存 + 大規模平行運算 (像搜尋)

主要壓力是『即時回應 + 一致畫面』
   → 可考慮集中式 client-server 叢集,靠分區降載 (像 EVE Online)

主要壓力是『大量異質事件即時處理』
   → 走事件導向 (event-based) + 複雜事件處理 (像金融)

值得注意的反直覺一課:最大的線上遊戲 EVE Online 反而選了集中式 client-server,因為單一份世界狀態更好管理、更容易維持一致,再用『把高負載星系分到專屬電腦』來解決效能。這提醒我們:

去中心化不一定比較好;集中式換來的『一致性與好管理』有時更值錢。

下次設計系統時,別急著套流行架構,先問:『我最大的壓力是量、是快、還是亂?』

💡
關鍵

選架構前先辨認主要壓力 (量 / 快與一致 / 雜亂事件);EVE Online 證明集中式為了一致與好管理,有時勝過去中心化。

🔆
生活妙喻:網頁搜尋的規模挑戰 ≈ 替上百億本書編目的超大圖書館團隊

書多到不可思議又不斷新增,要秒回查詢就得有特製書架、索引與龐大團隊,對應搜尋引擎的分散式儲存與大規模運算。

🔆
生活妙喻:金融交易的事件處理 ≈ 新聞快訊編輯台

各種格式的快訊湧入,先用翻譯員 (adapter) 統一格式,再用自動偵測員 (CEP) 盯著樣式即時反應,對應事件導向系統。

本節字彙

Client-server (用戶端-伺服器)
一種架構:用戶端發出請求,集中的伺服器處理並回應,世界狀態通常集中保管。
🧠 Client 點餐、Server 上菜;連最大的線上遊戲 EVE 都靠這套。
Event (事件)
分散式系統中值得傳遞與處理的『發生的事』,如股價下跌、數據發布。
🧠 Event = 一件事發生了,要趕快通知有興趣的人。
Complex Event Processing / CEP (複雜事件處理)
把多個事件依邏輯、時間或空間樣式組合起來,用以偵測機會並自動反應。
🧠 把零散事件『拼成樣式』,像偵探把線索拼成案情。
課本提到最大的線上遊戲 EVE Online 採用集中式 client-server 架構。這個選擇『反直覺』之處與主要好處分別是什麼?
金融交易系統的事件來自 Reuters、FIX 等不同格式。系統用 adapter 把它們轉成共同內部格式,這主要在解決哪個問題?
三個範例對設計者施加的『主要壓力』各不相同。下列配對哪一個最正確?
02

推動分散式系統的趨勢

現代 Internet 把各種網路黏成一片,加上行動與無所不在運算,讓裝置隨時隨地連線、自動找服務。

普及網路與行動運算

現代 Internet 把各種網路黏成一片,加上行動與無所不在運算,讓裝置隨時隨地連線、自動找服務。

STEP 1

深度探秘

把各種網路黏成一片,再讓裝置隨處連線、自動找服務

兩股趨勢:網路無所不在、運算無所不在

普及網路與現代 Internet

現代 Internet 是一大堆不同種類網路互連而成:有線、WiFi、WiMAX、Bluetooth、3G 行動網路…種類還一直增加。它最了不起的成就,是用一套共同的 Internet 協定,讓『任何地方的程式都能對任何地方的程式送訊息』,把底層五花八門的網路差異遮蔽 (abstract over) 掉。

幾個關鍵角色:

  • intranet (內部網路):公司或組織自管的子網路,常用 firewall (防火牆) 保護。
  • firewall:靠過濾進出訊息來保護 intranet,可依來源、目的或服務類型過濾。最強的防火牆其實是『根本不連上 Internet』。
  • ISP:提供寬頻與連線,讓個人與小組織接上 Internet。
  • backbone (骨幹):高傳輸量的網路連線 (光纖、衛星等),把各 intranet 串起來。

行動與無所不在運算

裝置變小、無線普及,催生兩個重疊但不同的概念:

  • 行動運算 (Mobile computing):使用者在移動中或在外地仍能透過隨身裝置存取資源;衍生出情境感知 (location/context-aware) 運算。挑戰是連線時有時無、甚至斷線
  • 無所不在運算 (Ubiquitous computing):把許多小而便宜的運算裝置藏進日常環境 (家裡、辦公室),小到讓人幾乎察覺不到

兩者的差別:行動運算強調『在移動』,無所不在運算強調『裝置藏在環境裡』。而當訪客帶著裝置走進陌生環境、要臨時用當地的印表機時,就需要 spontaneous interoperation (自發互通)service discovery (服務發現)

💡
關鍵

Internet 用共同協定遮蔽底層各種網路差異;行動運算讓『人』隨處存取,無所不在運算讓『裝置』藏進環境,兩者重疊但側重不同。

STEP 2

生活妙喻

萬國通用的郵政系統,加上隨身翻譯機

兩個比喻

Internet 像萬國通用的郵政系統

世界上有飛機、貨船、卡車、機車快遞 (各種網路),速度規格都不同。但只要你把信寫好、貼上標準地址 (Internet 協定),郵政系統就能把它從任何角落送到任何角落,你完全不用管中途換了幾種交通工具——這就是『遮蔽底層差異』。

  • intranet = 一棟有門禁的公司大樓
  • firewall = 大樓警衛,檢查誰能進出
  • backbone = 城際高速公路
  • ISP = 幫你家接上馬路的承包商

行動 vs 無所不在運算:旅人 vs 智慧旅館

  • 行動運算像一位帶著隨身翻譯機到處旅行的人:不管走到哪個國家,都能繼續處理自己的事,重點在『人會動,服務跟著走』。
  • 無所不在運算像一間到處藏著感應器的智慧旅館:燈、冷氣、窗簾自己感應你而動作,你幾乎不會注意到有電腦。重點在『裝置藏在環境裡』。

當這位旅人走進這間智慧旅館,想用房間裡的印表機印登機證——他的手機得臨時跟陌生印表機搭上線 (自發互通),還要先找到那台印表機 (服務發現)

💡
關鍵

Internet 像遮蔽交通工具差異的萬國郵政;行動運算是帶翻譯機旅行的人,無所不在運算是藏滿感應器的智慧旅館。

STEP 3

實用超能力

看穿一個情境用到了哪些角色與機制

拆解一個真實情境

課本給了經典情境:一位訪客帶著筆電、手機、數位相機到別的公司開會。我們用一張圖看清各裝置走哪條路、用到哪些機制:

flowchart TD
  A[訪客的筆電] -->|host 無線 LAN 經 gateway| B[host intranet]
  C[訪客的手機] -->|3G 行動網路| D[Internet]
  E[訪客的數位相機] -->|個人區域無線網路 約十公尺| F[會議室印表機]
  B --> D
  F --> B
  D --> G[home intranet 的資源]

從這張圖你能讀出實用觀念:

  • 同一個人可能同時用三種無線連線,各走各的路徑。
  • 相機直接連印表機,只需要兩者之間的無線連線,不必經過整個網路。
  • 要讓訪客的裝置在陌生網路馬上能用當地服務,挑戰在於讓自發互通又快又方便——這就是 service discovery 要解決的事。

實務上,當你在咖啡廳用筆電投影、用手機 GPS 導航、用 AirDrop 傳照片給旁邊的人,你正在同時體驗『普及網路 + 行動 + 無所不在 + 自發互通』。學會這套詞彙,你就能精準說出每個動作背後的機制。

💡
關鍵

用『裝置走哪條連線、需不需要經過整個網路、如何在陌生環境臨時搭上服務』來拆解任何行動情境。

🔆
生活妙喻:Internet 遮蔽底層網路差異 ≈ 萬國通用的郵政系統

不論中途換了飛機、貨船還是卡車,只要貼上標準地址就能送達;正如 Internet 協定讓程式不用管底層是 WiFi 還是光纖。

🔆
生活妙喻:行動運算 vs 無所不在運算 ≈ 帶翻譯機旅行的人 vs 藏滿感應器的智慧旅館

前者強調『人會動、服務跟著走』,後者強調『裝置藏進環境、讓人察覺不到』,兩者重疊但側重不同。

本節字彙

Firewall (防火牆)
保護 intranet 的機制,靠過濾進出的訊息來阻擋未授權的存取。
🧠 Fire-wall = 擋火牆,守在門口檢查訊息能不能進出。
Mobile computing (行動運算)
使用者在移動中或外地,仍透過隨身裝置存取資源的運算方式。
🧠 Mobile = 會動的;重點是『人在動』。
Service discovery (服務發現)
讓裝置在陌生環境中自動找到並連上合適的本地服務 (如印表機) 的過程。
🧠 走進陌生地方先『發現』有哪些服務可用,才能臨時搭上線。
課本說 Internet 協定最了不起的成就是『讓任何地方的程式能對任何地方的程式送訊息,並遮蔽底層網路差異』。下列哪個比喻最貼切?
一位員工在家用筆電連回公司內部系統,公司用某機制過濾所有進出內部網路的訊息以阻擋未授權連線。這個機制是?
下列哪一個情境最能體現『無所不在運算 (ubiquitous computing)』而非單純的『行動運算』?

多媒體與雲端運算

連續媒體有時間維度,對系統提出 QoS 要求;把資源當公用事業租用,就是雲端運算與其背後的叢集電腦。

STEP 1

深度探秘

會跑的媒體要趕時間,運算可以像水電一樣租

兩個趨勢:分散式多媒體、把運算當公用事業

分散式多媒體系統

多媒體支援指『以整合方式支援多種媒體類型』。媒體分兩種:

  • 離散媒體 (discrete media):圖片、文字訊息等,沒有時間維度
  • 連續媒體 (continuous media):音訊、視訊等,有時間維度

連續媒體最關鍵的特性是:它的完整性取決於保留元素間的即時時間關係。例如視訊要維持一定的每秒幀數 (throughput),即時串流還要保證每幀的最大延遲 (latency)。如果幀來得忽快忽慢,影片就會卡頓、不同步——這正是服務品質 (Quality of Service, QoS) 的一個例子。

Webcasting (網路廣播) 就是典型應用:把連續媒體 (音訊/視訊) 在 Internet 上廣播。它對底層基礎設施提出要求:支援多種編碼/加密格式、提供 QoS 機制、做資源管理與排程、在無法滿足 QoS 時提供適應 (adaptation) 策略。

把分散式運算當成公用事業

隨基礎設施成熟,業界把分散式資源視為商品或公用事業 (utility),就像水或電——資源由供應商提供,使用者用租的而非買斷。可租的包括:

  • 實體資源:儲存、運算節點、資料中心。關鍵技術是作業系統虛擬化 (virtualization),你拿到的可能是虛擬節點而非實體機器。
  • 軟體服務:email、行事曆等,靠 web services 等標準互通。

這個願景的名字就是雲端運算 (cloud computing)——把『運算當服務、按用量付費』。雲端通常建在叢集電腦 (cluster computer) 上:一群緊密合作、對外像一台高效能電腦的互連電腦,常用便宜的商品硬體 (如一堆 Linux PC 或 blade server) 拼出規模。

💡
關鍵

連續媒體有時間維度、必須準時送達 (帶出 QoS);雲端運算把運算/儲存/軟體當水電一樣租用,底層靠叢集電腦撐起規模。

STEP 2

生活妙喻

傳送帶上的壽司 vs 自來水

兩個比喻

連續媒體像迴轉壽司的傳送帶

  • 離散媒體像一張照片:你慢慢看、隨時看都行,沒有時間壓力
  • 連續媒體像迴轉壽司的傳送帶:壽司 (影格) 要以穩定速度、準時送到你面前。如果忽快忽慢,畫面就會卡頓;如果太慢,你就會餓 (緩衝不足、影片轉圈圈)。

『保證壽司準時、穩定地送來』這件事,就是 QoS。要做到,廚房得事先保留好食材與人力 (保留資源);做不到時,就得改上比較簡單的菜 (adaptation,例如自動降畫質)

雲端運算像用自來水

以前你想用水,得自己挖一口井 (買伺服器):花大錢、要自己維護、用不用都得養著。

雲端運算把運算變成自來水:你只要打開水龍頭 (連上服務),用多少算多少錢,不用煩惱水從哪來、水塔多大。背後的自來水廠就是叢集電腦——很多便宜管線與幫浦 (商品 PC / blade) 合力供應大量的水。虛擬化則像把一條大水管分裝成很多戶人家各自的水表,彈性又好管理。

💡
關鍵

連續媒體像要準時穩定送達的迴轉壽司 (做不到就降畫質);雲端像自來水,按用量付費,背後的自來水廠就是叢集電腦。

STEP 3

實用超能力

判斷一個需求要不要 QoS、適不適合上雲

兩個實用判斷

判斷一:這個需求需要 QoS 嗎?

問自己:資料有沒有時間維度、晚到會不會毀掉體驗?

需求 有時間維度? 是否需要 QoS
下載一份 PDF 否 (離散) 否,慢一點沒關係
即時視訊會議 是 (連續) 是,幀要準時、低延遲
看點播電影 是 (連續) 是,但可先緩衝
收一封 email 否 (離散)

只要是『串流、即時、會卡頓影響體驗』的,就要認真規劃 QoS 與 adaptation。

判斷二:這個服務適合上雲嗎?

雲端的核心價值是『租用、按用量付費、不必自己養硬體』。它特別適合:

  • 負載會大起大落:用叢集 + 虛擬化彈性擴縮,省得自己買一堆閒置機器。
  • 想讓終端裝置很輕薄:因為運算放雲端,連簡單的桌機或平板都能用上強大資源。
需求負載忽高忽低、不想養機房
   → 上雲,靠叢集 + 虛擬化彈性租用
需求是即時連續媒體
   → 先確認雲端與網路能提供足夠 QoS,否則準備 adaptation

把這兩把尺記住,你看任何產品需求時,就能立刻說出『要不要 QoS、適不適合上雲』。

💡
關鍵

問『資料有沒有時間維度、晚到會不會毀體驗』判斷要不要 QoS;問『負載是否起伏、想不想養硬體』判斷適不適合上雲。

🔆
生活妙喻:連續媒體與 QoS ≈ 迴轉壽司的傳送帶

壽司 (影格) 要穩定準時送到面前,忽快忽慢就卡頓;保證準時就是 QoS,做不到時改上簡單菜色就是 adaptation。

🔆
生活妙喻:雲端運算 ≈ 用自來水而非自己挖井

打開水龍頭、用多少算多少,不必自建井與水塔;背後的自來水廠就是叢集電腦,虛擬化像把大水管分裝成各戶水表。

本節字彙

Quality of Service / QoS (服務品質)
系統能否在時限內提供足夠運算與網路資源,準時完成任務 (如準時顯示每一幀)。
🧠 QoS = 不只『有得用』,還要『準時、夠快、夠穩』。
Cloud computing (雲端運算)
把運算、儲存、軟體當成 Internet 上的服務來租用,常按用量付費。
🧠 雲端 = 運算像水電,打開就用、用多少付多少。
Cluster computer (叢集電腦)
一群緊密合作、對外像單一高效能電腦的互連電腦,常用便宜商品硬體拼成。
🧠 Cluster = 一串葡萄;很多便宜電腦串在一起當一台超強電腦。
為什麼即時視訊串流需要 QoS,而下載一份 PDF 通常不需要?
一個視訊服務在網路壅塞、無法維持原畫質時,自動把畫質降到較低解析度以維持播放順暢。這對應課本提到的哪個策略?
一家新創不想自建機房,希望運算與儲存『用多少付多少、負載高時能彈性擴充』。這最符合哪個概念?
03

聚焦於資源共享

資源被封裝在電腦裡,只能透過服務提供的操作介面存取;client 主動發請求、server 被動回應,構成 client-server 模式。

服務、用戶端與伺服器

資源被封裝在電腦裡,只能透過服務提供的操作介面存取;client 主動發請求、server 被動回應,構成 client-server 模式。

STEP 1

深度探秘

資源被關在電腦裡,只能透過一扇『服務之窗』存取

為什麼資源要透過服務存取

建構分散式系統最主要的動機就是共享資源 (resource sharing)。我們天天在共享:印表機 (硬體)、檔案 (資料)、搜尋引擎 (特定功能)。

但有個物理事實:資源被實體封裝在某台電腦裡,其他電腦只能透過通訊來存取它。所以課本給了幾個關鍵詞:

  • 服務 (service):系統中管理一組相關資源、並把功能對外呈現的部分。我們透過 file service 存取共享檔案、透過 printing service 列印。
  • 我們對服務的唯一存取方式,就是它對外提供的那組操作 (operations)。例如 file service 提供 read、write、delete。

為什麼要限制成『一組明確操作』? 一半是良好的軟體工程習慣 (封裝),一半是物理現實:資源在別台電腦,必須由一個程式提供通訊介面,才能可靠、一致地被存取與更新。

client、server 與 remote invocation

  • server (伺服器):在網路電腦上執行的程式 (process),接受其他電腦程式的請求、執行服務並回應。
  • client (用戶端):發出請求的程式。整套做法叫 client-server computing
  • 當 client 請求某操作,我們說它對 server 發起一次操作 (invokes an operation);從送出請求到收到回應的完整來回,稱為遠端呼叫 (remote invocation)

幾個容易考的細節:

  • client 與 server 是『角色』而非機器:同一個程式可以既是 client 又是 server (server 有時會去呼叫別的 server)。這兩個詞只針對單一次請求而言。
  • client 主動 (發請求)、server 被動 (收到請求才醒來);server 持續運行,client 只活在它所屬應用程式存在的期間。
  • 在物件導向的分散式系統裡,資源可封裝成物件 (object),由 client object 對 server object 呼叫方法 (method)

瀏覽器就是 client,它向 web server 請求網頁——這正是下一章 WWW 案例的核心。

💡
關鍵

資源被封裝在電腦裡,只能透過服務提供的一組明確操作存取;client 主動發請求、server 被動回應,一次完整來回叫遠端呼叫。

STEP 2

生活妙喻

餐廳的點餐窗口

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

想像一間餐廳:

  • 廚房裡的食材與廚具 (資源)不能直接伸手去拿——它們被封裝在廚房裡。
  • 你只能透過點餐窗口 (服務),用菜單上有的選項 (一組明確操作) 來互動:你能『點餐、加點、退單』,但不能說『讓我進廚房自己翻冰箱』。
  • 你 (client) 主動走到窗口點餐 (發請求)廚房/服務生 (server) 平常待命,收到點單才動作 (被動回應)
  • 從你『開口點餐』到『餐點送到面前』這一整個來回,就是一次 remote invocation

幾個對應得很妙的細節:

  • 角色不是身分:一位服務生可能對顧客是 server,但他轉身向廚房點貨時,他又變成廚房的 client。角色只看『這一次互動』
  • 菜單就是介面:你只能點菜單上有的東西 (read/write/delete),這保證了廚房能可靠、一致地出餐,不會被亂搞。

這個比喻幫你記住核心觀念:封裝資源、只開放明確操作、主動點餐 vs 被動出餐

💡
關鍵

服務像餐廳點餐窗口:資源封在廚房、只能用菜單上的選項互動;你主動點餐 (client)、廚房被動出餐 (server),一次來回是 remote invocation。

STEP 3

實用超能力

在任何系統裡指出 client、server 與操作介面

用 client-server 視角拆解真實系統

學會這套詞彙,你就能把任何網路系統畫成清楚的角色圖。以瀏覽器看網頁為例:

flowchart LR
  A[瀏覽器 client] -->|請求 取得網頁| B[web server]
  B -->|回應 網頁內容| A
  B -->|它自己也當 client| C[資料庫 server]
  C -->|回傳查詢結果| B

從這張圖讀出三個實用重點:

  1. 找出操作介面:web server 只回應一小組操作 (主要是取得資源)。指認介面,你就知道『這個服務能做什麼、不能做什麼』。
  2. 角色會切換:web server 對瀏覽器是 server,但它去查資料庫時又變成 client。分析系統時要逐次請求判斷角色。
  3. 主動 vs 被動:瀏覽器關掉了,網站照樣運行 (server 持續存在、client 短命)。

實務檢核清單,拿到任何系統先問:

  • 誰主動發請求 (client)? 誰待命回應 (server)?
  • 這個服務對外開放哪些操作 (介面)? 哪些被刻意封起來?
  • 有沒有哪個元件同時扮演兩種角色?

回答完這三題,你就掌握了這個系統的互動骨架,也為理解後面所有架構打好地基。

💡
關鍵

拿到任何系統先問『誰主動發請求、誰待命回應、開放哪些操作、誰身兼兩角』,就能畫出它的 client-server 互動骨架。

🔆
生活妙喻:服務只開放一組明確操作 ≈ 餐廳的點餐窗口與菜單

你不能進廚房自己拿食材,只能用菜單上的選項點餐;正如服務把資源封裝起來,只開放 read、write、delete 等明確操作。

🔆
生活妙喻:client 與 server 是角色而非機器 ≈ 服務生對顧客是 server、向廚房點貨時又成了 client

同一個人在不同互動中扮演不同角色;同一個程式也可能既是 client 又是 server,角色只看單一次請求。

本節字彙

Service (服務)
系統中管理一組相關資源、並只透過一組明確操作對外呈現功能的部分。
🧠 Service = 服務窗口;只給你菜單上的選項,不讓你進廚房。
Server (伺服器)
在網路電腦上執行、接受請求並回應的程式 (process),被動且持續運行。
🧠 Server = 服務生;待命,收到點單才動作。
Remote invocation (遠端呼叫)
從 client 送出請求到收到 server 回應的一次完整互動。
🧠 Remote = 隔著網路;invocation = 呼叫一次,一來一回算一次。
課本強調服務只透過『一組明確操作 (如 read、write、delete)』開放資源。這個限制同時反映了哪兩件事?
一個 web server 在回應瀏覽器的同時,自己去向資料庫查詢資料。關於它的角色,下列敘述何者正確?
你關掉瀏覽器後,網站仍持續運行。這最能說明 client 與 server 的哪個差異?
04

設計上的八大挑戰

硬體、OS、語言、網路五花八門 (異質性),靠中介軟體與共同標準弭平;公開介面讓系統能被擴充與重做 (開放性)。

異質性與開放性

硬體、OS、語言、網路五花八門 (異質性),靠中介軟體與共同標準弭平;公開介面讓系統能被擴充與重做 (開放性)。

STEP 1

深度探秘

東西五花八門 (異質性),還要能不斷加裝與重做 (開放性)

挑戰一:異質性 (Heterogeneity)

異質性就是『變化與差異』。它出現在五個層面:

  • 網路 (Ethernet、WiFi…)
  • 電腦硬體 (例如整數的位元組順序 byte ordering 有兩種)
  • 作業系統 (UNIX 與 Windows 的訊息收發 API 不同)
  • 程式語言 (字元、陣列、紀錄的表示法不同)
  • 不同開發者的實作 (沒有共同標準就無法互通)

如何弭平這些差異? 兩大武器:

  • 共同標準:例如所有連上 Internet 的電腦都用 Internet 協定溝通,網路差異就被遮蔽。
  • 中介軟體 (middleware):一層軟體,提供程式設計抽象,同時遮蔽底層網路、硬體、OS、語言的異質性。例如 CORBA (跨語言)、Java RMI (單一語言)。中介軟體還提供統一的運算模型,如 remote object invocation。

另一個相關概念是行動程式碼 (mobile code):能從一台電腦傳到另一台執行的程式碼 (如 JavaScript)。難點在於執行檔通常綁定特定指令集與 OS。虛擬機器 (virtual machine) 是解法:編譯器產生 VM 的程式碼而非特定硬體碼,例如 Java 編譯成 bytecode 由 JVM 解譯,每種電腦只要實作一次 JVM。

挑戰二:開放性 (Openness)

開放性決定系統能否被擴充重新實作。對分散式系統而言,主要看『能否加入新的資源共享服務、並被各種 client 使用』。

達成開放性的關鍵步驟:

公開 (publish) 關鍵軟體介面的規格與文件。

例如 Internet 的設計者推出 RFC (Requests For Comments) 系列文件,公開通訊協定規格;W3C 公開 Web 相關標準。介面公開後,不同人寫的元件才能整合。

開放系統的三個重點:介面被公開、提供統一通訊機制與公開介面存取資源、可由不同廠商的異質軟硬體組成 (但每個元件都須仔細測試是否符合標準)。

💡
關鍵

異質性是硬體/OS/語言/網路/實作的差異,靠共同標準與中介軟體弭平;開放性靠『公開關鍵介面』讓系統能加裝新服務、被各種 client 使用。

STEP 2

生活妙喻

聯合國同步口譯 vs 公開規格的樂高

兩個比喻

異質性與中介軟體像聯合國的同步口譯

聯合國裡各國代表講不同語言 (硬體、OS、語言的差異),彼此根本聽不懂。但只要每個人戴上同步口譯耳機 (中介軟體),講英文的、講法文的都能順暢開會——耳機遮蔽了語言差異,還提供統一的『開會方式』。

mobile code + 虛擬機器像一份『用世界語寫的劇本』:劇本 (bytecode) 本身不分國籍,只要每個劇團都養一位該語言的導讀員 (JVM),同一份劇本就能在任何國家上演。

開放性像規格公開的樂高

樂高為什麼能無限擴充? 因為它的凸點規格是公開的 (published interface)

  • 任何廠商只要照規格做積木,就能跟現有積木拼在一起 (加入新服務、被各種 client 使用)。
  • 你不會被單一廠商綁死 (獨立於個別 vendor)。
  • 但前提是:每塊積木都得確實符合規格,否則拼不起來 (元件須測試是否符合標準)。

相反地,若某個玩具的接頭規格保密,別人就無法做相容配件——那就是封閉系統。Internet 的 RFC、Web 的 W3C 標準,就是那份『公開的樂高凸點規格』。

💡
關鍵

中介軟體像聯合國同步口譯耳機,遮蔽語言差異並統一開會方式;開放性像規格公開的樂高,誰照規格做都能拼進來、不被單一廠商綁死。

STEP 3

實用超能力

用一張圖看懂中介軟體站在哪、判斷系統夠不夠開放

中介軟體站在哪一層?

flowchart TD
  A[分散式應用程式] --> B[中介軟體 middleware]
  B --> C[作業系統]
  C --> D[電腦硬體與網路]
  B -. 遮蔽 OS 語言 硬體差異 .-> A

中介軟體夾在『應用程式』與『OS』之間,向上提供統一的程式設計模型,向下吸收各種異質差異。寫應用的人因此可以少操心底層是誰

實務判斷一個系統夠不夠開放

問三個問題:

  1. 關鍵介面有沒有公開? 有公開文件/規格 → 偏開放;藏起來 → 偏封閉。
  2. 第三方能不能加入新服務、做相容元件? 能 → 開放;只能用原廠的 → 封閉。
  3. 會不會被單一廠商綁死? 能換廠商 → 開放的好處之一。
想讓系統未來能不斷擴充、被很多人接
   → 先把關鍵介面公開 (像 RFC W3C)
想讓不同語言 不同 OS 的元件互通
   → 引入中介軟體吸收異質性

下次評估一個平台或 API,先看它『介面公不公開、能不能被第三方擴充』,你就能一眼判斷它的開放程度與長期擴充潛力。

💡
關鍵

中介軟體夾在應用與 OS 之間,向上統一模型、向下吸收異質;判斷開放性就看『介面是否公開、第三方能否擴充、會不會被單一廠商綁死』。

🔆
生活妙喻:中介軟體遮蔽異質性 ≈ 聯合國的同步口譯耳機

各國代表講不同語言卻能順暢開會,因為耳機遮蔽了語言差異並提供統一的開會方式,正如中介軟體遮蔽硬體/OS/語言差異。

🔆
生活妙喻:開放性與公開介面 ≈ 凸點規格公開的樂高

因為規格公開,任何廠商照規格做積木都能拼進來、不被單一廠商綁死,正如公開介面讓第三方加入新服務。

本節字彙

Heterogeneity (異質性)
系統由各種不同的網路、硬體、作業系統、語言與實作組成所帶來的差異。
🧠 Hetero = 不同的;一堆不一樣的東西要湊在一起合作。
Middleware (中介軟體)
一層軟體,提供統一的程式設計抽象,並遮蔽底層網路、硬體、OS、語言的差異。
🧠 Middle = 中間;夾在應用與 OS 中間當翻譯與橋樑。
Openness (開放性)
系統能被擴充與重新實作的特性,關鍵在於公開關鍵介面。
🧠 Open = 打開;把介面公開,別人才能接進來、加東西。
一個系統要讓『C++ 寫的伺服器』與『Java 寫的用戶端』在不同硬體上互通。中介軟體在此最主要的貢獻是什麼?
Java 程式碼編譯成 bytecode、由各平台的 JVM 解譯執行。這個做法主要解決了異質性的哪個面向?
Internet 的設計者推出 RFC 系列、W3C 公開 Web 標準。這些做法主要支撐了哪個挑戰的解決?

安全與可擴展性

安全要顧機密性、完整性、可用性,還要對抗 DoS 與惡意行動程式碼;可擴展性要在用戶與資源暴增時仍維持效能。

STEP 1

深度探秘

資訊要守住三件事,系統要在暴增時還撐得住

挑戰三:安全 (Security)

分散式系統裡的資訊往往很有價值,安全因此至關重要。資訊安全有三個要素

  • 機密性 (Confidentiality):防止洩漏給未授權者。
  • 完整性 (Integrity):防止被竄改或破壞。
  • 可用性 (Availability):防止存取資源的手段被干擾。

在分散式系統中,client 把請求透過網路送給 server,挑戰有兩層:

  1. 安全地傳遞敏感資訊 (如信用卡號);
  2. 正確辨識遠端的使用者或代理人身分 (server 要確認對方真的是醫師;user 要確認對方真的是那家銀行)。

這兩者都能靠加密技術 (encryption) 解決,已廣泛用於 Internet。但有兩個尚未完全解決的安全挑戰:

  • 阻斷服務攻擊 (Denial of Service, DoS):用海量無意義請求灌爆服務,讓正常使用者無法使用。目前多靠事後抓人懲處,並非根本解法。
  • 行動程式碼的安全:收到的執行檔 (如 email 附件) 可能表面顯示有趣圖片,實際卻在偷存取本機資源或參與 DoS。

挑戰四:可擴展性 (Scalability)

系統若在資源數與使用者數大幅增加時仍維持有效,就稱為可擴展。設計可擴展系統的挑戰:

  • 控制實體資源成本:n 個使用者所需資源量最多應為 O(n) (與 n 成正比)。例如 1 台檔案伺服器支援 20 人,2 台就該支援 40 人。
  • 控制效能損失:管理大小與使用者成正比的資料時,階層式結構比線性結構好。階層式存取時間為 O(log n),效能損失不應比這更糟。
  • 防止軟體資源耗盡:例如 32 位元 IP 位址不夠用,只好改用 128 位元 (IPv6)。但過度為未來預留也有代價 (佔更多空間)。
  • 避免效能瓶頸:演算法應去中心化。例如 DNS 把名稱表分割給遍佈各地的伺服器、在地管理,取代了早期單一主檔的瓶頸。常熱門的資源可用快取 (caching)複製 (replication) 提升效能。
💡
關鍵

安全要守住機密性、完整性、可用性 (DoS 與行動程式碼仍難解);可擴展性要控制成本 O(n)、用階層化與去中心化避免瓶頸、靠快取與複製撐住熱點。

STEP 2

生活妙喻

保險箱三道防線 vs 連鎖店展店

兩個比喻

安全像保險箱的三道防線

  • 機密性像保險箱鎖好不讓外人看見內容
  • 完整性像在文件上加防偽封條,一旦被動過手腳就看得出來。
  • 可用性像確保鑰匙與通道暢通,需要時你拿得到東西。

而兩個難解問題:

  • DoS 像一群人故意擠爆銀行大門,讓真正要辦事的客戶進不去——你很難只靠『門口檢查』擋掉,因為他們看起來都像顧客。
  • 行動程式碼風險像有人塞給你一個包裝精美的禮物盒,你不知道拆開後是蛋糕還是炸彈。

可擴展性像連鎖店展店

一家餐廳生意太好排隊排到天邊,怎麼辦?

  • 控制成本 O(n):客人加倍,分店數大致也加倍就好,不該『客人加倍卻要蓋十倍的店』。
  • 避免瓶頸 (去中心化):別讓全國訂位都打到同一支總機 (單一主檔的瓶頸),改成各分店自己接訂位 (DNS 把名稱表分割、在地管理)。
  • 快取與複製:最熱賣的招牌菜先大量備好放在每家分店 (replication)、或把常被問的菜單貼在門口 (caching),省得每次都跑回中央廚房。
💡
關鍵

安全像保險箱的機密、完整、可用三道防線 (DoS 像擠爆大門、惡意程式像未知禮物盒);可擴展像連鎖店展店,靠成本控制、去中心化與快取/複製。

STEP 3

實用超能力

用 CIA 三要素稽核安全、用瓶頸思維設計擴展

工具一:用 CIA 三要素稽核任何系統的安全

拿到一個需求,逐項問:

要素 要問的問題 常見手段
機密性 Confidentiality 敏感資料會不會被偷看? 加密傳輸與儲存
完整性 Integrity 資料會不會被偷改? checksum、簽章
可用性 Availability 服務會不會被癱瘓? 防 DoS、備援

再加一句提醒:身分辨識同樣關鍵——不只要藏好訊息,還要確定對方真的是他宣稱的人。

工具二:用『瓶頸思維』設計可擴展系統

問 1 使用者加倍 資源成本會不會也只加倍 (O(n))?
   不會 → 重新設計, 別讓成本爆炸
問 2 有沒有一個所有請求都會打到的單點?
   有 → 去中心化 (像 DNS 分割名稱表)
問 3 有沒有被超熱門存取的資源?
   有 → 用快取與複製分散壓力

實戰例子:設計一個全球用戶都會查的『商品名稱對應資料』服務,照課本智慧——名稱用階層式設計 (O(log n) 存取)把資料分割並複製到各地伺服器在地服務,就能在使用者暴增時把效能損失壓到最低、避開單點瓶頸。

把 CIA 與瓶頸思維變成你的反射動作,安全與擴展兩大挑戰你就抓得住七成。

💡
關鍵

用 CIA 三要素 (機密/完整/可用) 加身分辨識稽核安全;用『成本是否 O(n)、有無單點、有無熱點』三問搭配階層化、去中心化、快取複製設計擴展。

🔆
生活妙喻:資訊安全三要素 ≈ 保險箱的三道防線

機密性=鎖好不給看、完整性=防偽封條防竄改、可用性=鑰匙通道暢通隨時拿得到,正好對應 Confidentiality、Integrity、Availability。

🔆
生活妙喻:去中心化避免瓶頸 ≈ 連鎖店讓各分店自己接訂位,而非全打到一支總機

DNS 把名稱表分割給各地伺服器在地管理,取代早期單一主檔的瓶頸,正如展店時讓各分店分擔總機壓力。

本節字彙

Denial of Service / DoS (阻斷服務攻擊)
用海量無意義請求灌爆服務,使正常使用者無法使用,是尚未根本解決的安全難題。
🧠 DoS = 故意擠爆大門,讓真正要辦事的人進不去。
Scalability (可擴展性)
在資源數與使用者數大幅增加時,系統仍能維持有效運作的能力。
🧠 Scale = 規模;能跟著規模長大還不垮,就是可擴展。
Caching / Replication (快取 / 複製)
把熱門資源暫存或在多處備份,以分散壓力、提升存取效能的技術。
🧠 快取=暫存常用的、複製=多處放副本,都是替熱點分流。
醫師要遠端存取病患資料。系統不只要把資料加密傳輸,還要『確認對方真的是醫師』。後者對應安全的哪個重點?
某熱門網站被海量無意義請求灌爆,導致正常使用者無法使用。這是哪種攻擊? 課本對它的態度是?
課本說『1 台檔案伺服器支援 20 人,2 台就該支援 40 人』。這在闡述可擴展性的哪個目標?

錯誤處理、並行、透通性與服務品質

分散式系統的失效是『部分失效』;多用戶帶來並行衝突;透通性把分散細節藏起來;QoS 提供效能與時限保證。

STEP 1

深度探秘

壞了只壞一部分、多人會搶資源、把分散藏起來、還要準時

挑戰五:錯誤處理 (Failure handling)

分散式系統的失效是部分失效 (partial)——有些元件壞了,其他還在跑,這讓處理特別困難。對付失效有五招:

  • 偵測 (Detecting):有些能偵測 (如 checksum 抓出損壞資料),有些 (如遠端伺服器當機) 難以偵測,挑戰是『懷疑卻無法確定』時還能撐住。
  • 遮蔽 (Masking):把已偵測的失效藏起來或減輕,例如訊息沒到就重傳、資料寫到兩顆硬碟。但不保證最壞情況有效。
  • 容忍 (Tolerating):有些失效乾脆讓 client 容忍。例如瀏覽器連不到伺服器,不會讓你永遠空等,而是告知問題、讓你稍後再試。
  • 復原 (Recovery):設計軟體讓當機後資料能回復或『回滾 (roll back)』到一致狀態。
  • 冗餘 (Redundancy):用備援元件容錯,例如路由間至少兩條路徑、DNS 名稱表至少複製在兩台伺服器、資料庫複製到多台。

分散式系統因此能在硬體故障時維持高可用性 (availability):某元件壞了,只影響正在用它的工作。

挑戰六:並行 (Concurrency)

多個 client 可能同時存取共享資源。若把每個請求一次處理一個,吞吐量太低;於是通常允許並行處理。但若多個執行緒在同一物件內未受控地交錯操作,就可能產生不一致結果 (課本的拍賣例子:兩筆出價交錯後金額被張冠李戴)。

任何代表共享資源的物件,都必須負責在並行環境下仍正確運作。

做法是把操作同步 (synchronize),例如用 semaphore 等技術,讓資料保持一致。

挑戰七:透通性 (Transparency)

透通性是『對使用者與程式設計師隱藏元件的分散事實』,讓系統看起來像一個整體。RM-ODP 定義八種透通性:存取、位置、並行、複製、失效、移動 (mobility)、效能、擴展。其中存取透通性位置透通性最重要,合稱網路透通性。例如 email 位址不必知道對方實體位置 (位置+存取透通);email 會一直重試直到送達 (失效透通)。

挑戰八:服務品質 (Quality of Service)

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

💡
關鍵

失效是部分失效,靠偵測/遮蔽/容忍/復原/冗餘對付;並行需同步避免交錯衝突;透通性把分散藏起來 (存取與位置最重要);QoS 要靠保留資源達成時限保證。

STEP 2

生活妙喻

公司部門、共用白板、隱形管家、預約包廂

四個比喻

部分失效像一間公司某個部門請假

如果是單機程式,像一個人感冒就全身癱瘓;分散式系統像一間公司,會計部請假,業務部照常上班 (部分失效)。麻煩的是——你打電話到會計部沒人接,分不清是請假還是只是去洗手間 (難以偵測的失效)。對策:重要文件多印幾份放不同部門 (冗餘)、電話沒人接就告知並請稍後再撥 (容忍)

並行像大家搶寫同一塊白板

兩個人同時上去改同一行字,若沒人協調,最後白板上會是東拼西湊的錯字 (拍賣金額被張冠李戴)。解法是裝一支白板筆,誰拿到筆才能寫 (同步 / semaphore)

透通性像一位隱形管家

你說『幫我拿那份檔案』,管家自己跑去不知哪個房間 (哪台伺服器) 拿來,你完全不必知道它放哪、是不是有副本、中途有沒有出小狀況——這就是把分散細節藏起來。最重要的兩種:用一樣的方式拿東西 (存取透通)不必知道東西放哪 (位置透通)

QoS 像預約餐廳包廂

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

💡
關鍵

部分失效像某部門請假 (其他照常但難分辨狀態)、並行像搶寫白板要靠白板筆、透通性像隱形管家替你藏起細節、QoS 像預約包廂保證準時上菜。

STEP 3

實用超能力

對失效備好五招、看穿系統有哪些透通性

工具一:面對失效,備齊五招清單

flowchart TD
  A[元件可能失效] --> B{能偵測嗎}
  B -->|能| C[遮蔽 重傳或寫雙硬碟]
  B -->|難偵測| D[容忍 告知用戶稍後再試]
  C --> E[復原 當機後回滾到一致狀態]
  D --> E
  E --> F[冗餘 多條路徑 多份複製持續提供服務]

設計時別只想『不要壞』,而是假設一定會壞,然後問:能偵測嗎? 偵測不到怎麼撐? 壞了如何回復? 要不要備援?

工具二:替系統盤點透通性

拿一個系統,逐項檢查它『藏住了什麼』:

透通性 它藏住的事 生活例子
存取 (Access) 本機/遠端用一樣的操作 開遠端資料夾跟本機一樣
位置 (Location) 不必知道實體/網路位置 寄 email 不必知道對方在哪
失效 (Failure) 隱藏故障 email 重試直到送達
複製 (Replication) 不必知道有幾份副本 多副本對你透明
移動 (Mobility) 資源/client 移動不受影響 通話時手機跨基地台

記住:存取 + 位置 = 網路透通性,最關鍵

工具三:要不要做 QoS?

只要需求帶『時限』(每秒幾幀、幾毫秒內回應),就要保留資源並準備在資源不足時拒絕新請求或降級。把這三套工具內化,你就能系統化地處理失效、並行、透通與品質四大挑戰。

💡
關鍵

面對失效假設『一定會壞』、備齊偵測/遮蔽/容忍/復原/冗餘;用透通性表盤點系統藏了什麼 (存取+位置最關鍵);需求帶時限就要保留資源做 QoS。

🔆
生活妙喻:部分失效難以偵測 ≈ 打電話到某部門沒人接,分不清是請假還是去洗手間

其他部門照常運作 (部分失效),但你無法確定該部門是真的壞了還是只是慢,正是分散式失效難以偵測的核心。

🔆
生活妙喻:透通性 ≈ 一位隱形管家替你拿檔案

你不必知道檔案放哪台、有沒有副本、中途有沒有小狀況,管家把分散細節全藏起來,正如存取與位置透通性。

本節字彙

Partial failure (部分失效)
分散式系統中部分元件失效、其他仍運作的狀況,使失效處理特別困難。
🧠 Partial = 部分的;不是全倒,而是有人倒、有人還站著。
Transparency (透通性)
對使用者與程式設計師隱藏元件分散的事實,讓系統看似一個整體;最重要的是存取與位置透通性。
🧠 Transparent = 透明的;分散的細節被看穿、被忽略,像不存在。
Redundancy (冗餘)
用備援元件 (多條路徑、多份複製) 讓服務在部分失效時仍可運作的容錯手段。
🧠 Redundant = 多備一份;壞一個還有備胎頂上。
瀏覽器連不到伺服器時,不會讓你永遠空等,而是告知問題、讓你稍後再試。這對應課本對付失效的哪一招?
拍賣系統中兩筆出價『Smith: $122』與『Jones: $111』在未受控交錯下被存成『Smith: $111』『Jones: $122』。這是什麼問題? 課本建議怎麼解?
你寄一封 email 給某人,不必知道對方此刻人在哪個城市或哪台伺服器。這同時展現了哪兩種透通性 (合稱什麼)?
05

案例研究:World Wide Web

Web 是一個開放的超文本系統,建立在 HTML (內容)、URL (定位)、HTTP (request-reply 協定) 三項標準之上。

Web 三大基石:HTML、URL、HTTP

Web 是一個開放的超文本系統,建立在 HTML (內容)、URL (定位)、HTTP (request-reply 協定) 三項標準之上。

STEP 1

深度探秘

一個開放的超文本系統,站在三根標準柱子上

World Wide Web 是什麼

Web 是一個不斷演化、用來發布與存取資源/服務的系統,1989 年誕生於 CERN,最初是物理學家交換文件的工具。它的關鍵特色是超文本 (hypertext) 結構:文件裡含有連結 (hyperlinks),指向其他文件與資源,織成一張遍及全球的『連結之網』。

Web 是一個開放系統 (open system),能在不破壞既有功能下被擴充與重做。它的開放展現在兩方面:

  • 運作建立在自由公開、廣泛實作的通訊與內容標準上:任何符合標準的瀏覽器都能向任何符合標準的伺服器取資源。
  • 可發布的資源類型開放:發明新格式 (如新圖檔),立刻就能發布在 Web 上,瀏覽器再用 helper / plug-in 支援呈現。

三大標準技術元件

Web 的基本架構從沒大改,建立在三根柱子上:

  • HTML (HyperText Markup Language):描述網頁的內容與版面。用標籤 (tags)(以角括號包住,如 <p>) 標示標題、段落、表格、圖片與連結。重點:只有瀏覽器 (不是伺服器) 會解讀 HTML;伺服器只負責告知內容類型 (常從副檔名 .html 推斷)。
  • URL (Uniform Resource Locator):用來識別與定位資源。每個完整 URL 有兩大部分:scheme : scheme-specific-identifier。scheme 宣告類型 (http、ftp、mailto、tel…),這讓 Web 對『可存取的資源類型』保持開放。
  • HTTP (HyperText Transfer Protocol):規定瀏覽器等 client 如何與 web server 互動。

HTTP URL 的一般形式:

http:// servername [:port] [/pathName] [?query] [#fragment]

方括號內為選填。沒寫 port 預設 80;沒寫 pathName 就取預設首頁;? 後是查詢字串;# 後是片段識別碼 (由瀏覽器下載整份檔案後自行尋找)。

💡
關鍵

Web 是開放的超文本系統,靠 HTML (描述內容)、URL (定位資源)、HTTP (規定一問一答) 三根標準柱子運作;只有瀏覽器解讀 HTML,伺服器只告知內容類型。

STEP 2

生活妙喻

雜誌排版 vs 門牌地址 vs 取貨對話

用三個生活場景記住三大基石

把『請朋友幫你拿一本書』整個流程拆開:

HTML 像雜誌的排版指示

HTML 就是寫給排版師的指示:這裡放標題、這段是內文、這裡插一張圖、這個詞做成可點的連結。注意一個關鍵:排版指示只有排版師 (瀏覽器) 看得懂並照著畫出來;印刷廠 (伺服器) 只負責把這份稿子原封不動寄出,並在外面貼張標籤說『這是 HTML 稿』(內容類型)。

URL 像門牌地址

URL 就是資源的完整地址

http://  www.cdk5.net  /WebExample/moon.html
  ↑          ↑               ↑
用哪種協定   哪一棟 (伺服器)   裡面哪個房間 (路徑)
  • scheme (http/ftp/mailto) = 用哪種交通方式 (走路、坐船、寄信)。
  • servername = 哪一棟樓 (哪台伺服器)。
  • pathName = 樓裡哪個房間 (哪份資源)。
  • #fragment = 房間裡哪一頁 (文件中的某段),由你進房後自己翻到。

HTTP 像取貨的標準對話

HTTP 就是你跟櫃台的固定問答腳本:你說『我要 moon.html 這份』(request),櫃台找得到就把內容遞給你 (reply),找不到就回你一句熟悉的『404 找不到』。

💡
關鍵

HTML 像只有排版師 (瀏覽器) 看得懂的排版指示、URL 像 scheme+樓+房間的門牌地址、HTTP 像你跟櫃台『我要這份/給你/404』的固定問答腳本。

STEP 3

實用超能力

親手拆解一個 URL、看懂一次取頁流程

工具一:把任何 HTTP URL 拆成零件

拿課本的例子練手:

URL server path query fragment
http://www.cdk5.net www.cdk5.net (預設首頁)
http://www.w3.org/standards/faq.html#intro www.w3.org standards/faq.html intro
http://www.google.com/search?q=obama www.google.com search q=obama

看懂邊界符號 (/?#),你就能立刻讀懂瀏覽器網址列在做什麼。

工具二:跟著走一次取頁流程

flowchart LR
  A[使用者點 Moon 連結] --> B[瀏覽器查出對應 URL]
  B --> C[對 web server 發 HTTP 請求]
  C --> D[server 找到資源回傳內容並標示類型]
  D --> E[瀏覽器解讀 HTML 並渲染成網頁]
  E --> F[遇到圖片再各發一次請求取得]

這條流程把三大基石串起來:連結文字背後是 URL → 用 HTTP 一問一答 → 拿回 HTML 由瀏覽器渲染

為什麼 Web 這麼成功?

課本歸納三點,值得當設計準則:(1) 發布資源很容易、(2) 超文本結構適合組織各類資訊、(3) 系統架構開放——而且標準簡單、早早公開。下次你設計任何平台,想要它長壽又能被廣泛採用,這三點就是黃金範本。

💡
關鍵

用 / ? # 的邊界把 URL 拆成 server/path/query/fragment;一次取頁是『連結→URL→HTTP 問答→瀏覽器渲染 HTML』;Web 成功靠易發布、超文本、開放且標準簡單早公開。

🔆
生活妙喻:只有瀏覽器解讀 HTML ≈ 排版指示只有排版師看得懂,印刷廠只負責原樣寄出並貼標籤

瀏覽器才會解讀 HTML 並畫出版面,伺服器只把稿子原封送出並標示內容類型,正如排版師與印刷廠的分工。

🔆
生活妙喻:URL 的結構 ≈ 門牌地址:協定 + 哪棟樓 + 哪個房間 + 哪一頁

scheme 是交通方式、servername 是樓、pathName 是房間、#fragment 是房裡的某頁,組成資源的完整定位。

本節字彙

HTML (HyperText Markup Language)
用標籤描述網頁內容與版面的語言,僅由瀏覽器解讀渲染。
🧠 Markup = 標記;用 <tag> 標記哪裡是標題、段落、連結。
URL (Uniform Resource Locator)
識別並定位資源的字串,形式為 scheme : scheme-specific-identifier。
🧠 Locator = 定位器;像門牌,告訴你資源在哪、用哪種協定拿。
HTTP (HyperText Transfer Protocol)
規定瀏覽器等 client 如何向 web server 請求與接收資源的 request-reply 協定。
🧠 Transfer = 傳輸;像取貨對話『我要這份/給你/404』。
課本強調『只有瀏覽器 (不是伺服器) 會解讀 HTML,伺服器只負責告知內容類型』。這個分工帶來的好處是什麼?
把 URL `http://www.google.com/search?q=obama` 拆解,下列何者完全正確?
你輸入 `http://www.example.com`,沒寫 port 也沒寫路徑。根據 HTTP URL 規則會發生什麼?

從靜態網頁到動態服務與 Web Services

Web 不只取檔案,還能跑程式:CGI 在伺服器產生動態內容,JavaScript/applet 在瀏覽器執行,XML 與 REST 讓程式之間互通。

STEP 1

深度探秘

URL 不只指向檔案,還能指向會跑的程式

從『取檔案』到『用服務』

前一節談的是取出存在檔案裡的網頁 (靜態內容)。但使用者更多時候是在和服務互動:在網路商店填表單、送出查詢。這時:

  • 表單 (web form) 是一個含輸入元件 (文字框、核取方塊) 的網頁。送出時,瀏覽器把使用者填的值打包成 HTTP 請求送給伺服器。
  • 因為結果取決於使用者輸入,所以 URL (或其開頭) 指向的是伺服器上的一支程式,而非一個檔案
  • 小量參數常用 GET 放在 URL 的 query 部分;也可用 POST 當作額外資料夾帶。

例如 http://www.google.com/search?q=obama 會在伺服器執行名為 search 的程式、傳入查詢字串 obama,程式產生 HTML 當輸出。關鍵洞見

靜態檔案內容與動態產生的內容,對瀏覽器是透通的 (transparent)——它不知道也不在乎內容是讀檔還是程式現產的。

伺服器用來產生內容的程式稱為 CGI (Common Gateway Interface) 程式,常會查或更新資料庫。

把程式碼下載到瀏覽器執行

有時程式碼要跑在使用者的瀏覽器內

  • JavaScript:常隨網頁下載,提供比 HTML 標準元件更好的互動 (如即時檢查輸入),還能只更新網頁的一部分而不重抓整頁。當資料的到達與使用者動作無關時,稱為非同步 (asynchronous),對應技術即 AJAX (Asynchronous JavaScript And XML)
  • Applet:用 Java 寫、由瀏覽器自動下載執行的程式,可存取網路、提供客製介面。

Web Services 與 REST

瀏覽器之外,程式也能當 Web 的 client。但 HTML 不適合程式間互通——它是為『呈現給人看』而設計的。XML (Extensible Markup Language) 則用來以標準、結構化、自我描述的方式表示資料,可在應用間攜帶。

Web 資源提供服務專屬操作 (如下單、查訂單狀態)。REST (REpresentational State Transfer) 架構主張:每個資源都有 URL、且回應同一組操作 (GET、POST、PUT、DELETE),以此換取擴展性;缺點是軟體運作可能較不嚴謹。

💡
關鍵

動態網頁讓 URL 指向程式而非檔案 (CGI 在伺服器產內容);JavaScript/applet 在瀏覽器執行、AJAX 做非同步更新;XML 讓程式間互通,REST 讓每個資源都有 URL 並回應同一組操作。

STEP 2

生活妙喻

點餐機 vs 現做料理 vs 萬用插座

三個比喻

靜態 vs 動態:超商貨架 vs 現點現做

  • 靜態網頁像超商貨架上已經做好的便當:你拿了就走,每個人拿到的都一樣 (讀檔案)。
  • 動態網頁像餐廳的現點現做:你填了點餐單 (表單),廚房 (伺服器上的程式 / CGI) 依你的需求現場做一份給你 (依輸入產生 HTML)。

妙的是——你 (瀏覽器) 拿到餐點時,根本分不出是貨架上拿的還是現做的,這就是『靜態與動態對瀏覽器透通』。

下載程式碼到瀏覽器:把小幫手帶回家

JavaScript / applet 像餐廳附贈一個小幫手讓你帶回家:你在家填單時,小幫手當場幫你檢查有沒有填錯 (即時驗證),不必每次都跑回餐廳問。AJAX 則像小幫手只去廚房補一道菜,而不是把整桌重做一遍 (只更新部分網頁);而且這道菜什麼時候到不一定跟你的動作同步 (非同步)。

XML 與 REST:萬用插座與自帶說明的包裹

  • XML 像一個自帶完整標籤說明的包裹:拆開就知道裡面是什麼、什麼型別、怎麼組裝 (自我描述),所以不同機器 (程式) 都能讀懂,不像 HTML 只為『給人看』。
  • REST 像規定每個房間都用同一款萬用插座:每個資源都有自己的地址 (URL),而且都接受同一組標準操作 (GET/POST/PUT/DELETE),誰來都能插,超好擴充。
💡
關鍵

靜態像貨架便當、動態像現點現做 (但瀏覽器分不出);JavaScript/applet 像帶回家的小幫手、AJAX 只補一道菜;XML 像自帶說明的包裹、REST 像每處都用同款萬用插座。

STEP 3

實用超能力

判斷該用 GET/POST、程式碼放哪邊跑

工具一:這次互動該用 GET 還是 POST?

參數量很小 且只是查詢取資料
   → 用 GET, 把參數放在 URL 的 query 部分 (如 ?q=obama)
參數較多 或在送出資料 改變狀態
   → 用 POST, 把資料放在請求本體

工具二:這段程式碼該在哪邊跑?

需求 放哪跑 技術
依使用者輸入產生頁面、查改資料庫 伺服器 CGI 程式
即時檢查輸入、不重抓整頁就更新畫面 瀏覽器 JavaScript / AJAX
提供客製互動介面 瀏覽器 applet
程式對程式交換結構化資料 兩端 XML over HTTP

口訣:要產生內容、碰資料庫 → 伺服器端;要即時回饋使用者 → 瀏覽器端。

工具三:設計 API 時要不要走 REST?

如果你希望 API 容易擴充、每個東西都有一致的存取方式,REST 很合適:給每個資源一個 URL、用統一的 GET/POST/PUT/DELETE。代價是較不嚴謹,需要額外文件說明各操作細節 (這也是後續 web services 框架要補的)。

把這三套判斷內化,你就能把第一章學到的所有觀念——client-server、資源、透通性、開放性——具體落地到真實的 Web 開發決策上。這正是用 WWW 當案例的用意:讓抽象概念變成你手上的工具。

💡
關鍵

小量查詢用 GET、送資料改狀態用 POST;產內容碰資料庫放伺服器 (CGI)、即時回饋放瀏覽器 (JavaScript/AJAX);要 API 好擴充就走 REST,代價是較不嚴謹。

🔆
生活妙喻:靜態與動態內容對瀏覽器透通 ≈ 超商貨架便當 vs 餐廳現點現做

靜態是現成便當 (讀檔)、動態是依點餐單現做 (CGI 依輸入產生),但你拿到時分不出來,正如瀏覽器不在乎內容是讀檔還是現產。

🔆
生活妙喻:REST 的統一介面 ≈ 每個房間都用同一款萬用插座

每個資源都有自己的 URL,且都接受同一組標準操作 (GET/POST/PUT/DELETE),誰來都能插,因此特別好擴充。

本節字彙

CGI (Common Gateway Interface)
web server 用來依使用者輸入產生動態內容的程式,常會查詢或更新資料庫。
🧠 Gateway = 通往程式的閘道;URL 指到它就是『現點現做』。
AJAX (Asynchronous JavaScript And XML)
在瀏覽器用 JavaScript 非同步更新網頁部分內容、不重抓整頁的技術。
🧠 Asynchronous = 非同步;只補一道菜,且何時到不跟你的動作同步。
REST (REpresentational State Transfer)
一種 web services 架構:每個資源都有 URL,並回應同一組標準操作,換取擴展性。
🧠 每個資源同一組操作,像處處同款萬用插座。
當你在搜尋引擎送出查詢,URL 變成 `.../search?q=obama`。為什麼此時 URL 指向的是『程式』而非『檔案』?
課本說『靜態檔案內容與動態產生的內容,對瀏覽器是透通的』。這句話的意思是?
一個註冊表單希望在使用者打字時就即時提示『email 格式錯誤』,不必等送到伺服器再回報。最適合的做法是?