分散式與網路作業系統

分散式運算的謬誤(fallacies of distributed computing)

當程式設計師第一次做出一個會跨網路對話的東西時,他們往往把它當成「還是一支本機程式」來推理——並且默默假設了一串令人安心、卻根本不成立的事。分散式運算的謬誤,就是一份著名的清單(常見為八條,與 Sun 公司的 Peter Deutsch 等人有關),列的正是這些錯誤的假設。它們被收集起來,不是當作冷知識,而是當作一份「不斷咬傷新手的錯誤」檢核表,因為每一條一旦被相信,就會導向一個脆弱的系統。

經典的八條是:(1) 網路是可靠的——但訊息會遺失;(2) 延遲為零——但遠端呼叫遠比本機呼叫久得多;(3) 頻寬是無限的——但大量資料會塞爆管線;(4) 網路是安全的——但它可能被竊聽與攻擊;(5) 拓樸不會改變——但機器與路徑來來去去;(6) 只有一位管理員——但真實系統橫跨許多擁有者與政策;(7) 傳輸成本為零——但序列化與搬移資料會耗費 CPU 與金錢;(8) 網路是同質的——但它混雜了許多裝置、協定與速度。注意每一條謬誤,都只是從單機思維裡帶過來的、一個沒講出口的樂觀預設。

為什麼重要:這份清單是「過度信任網路」的實用解藥。一支假設呼叫永不失敗的程式,會在第一次失敗時就當掉;一支假設零延遲的程式,會在喋喋不休的呼叫穿過網路線時慢到令人痛苦;一支假設網路安全的程式,會被攻破。把這些謬誤當成必須事先回答的設計問題——當這個呼叫遺失、變慢、或被竄改時會怎樣?——你就會做出分散式系統真正需要的逾時、重試、加密與容量規劃。誠實的總結是:網路並不是一條「在一台機器內、更快更長的線」;它是一個充滿敵意、不可靠的媒介,而假裝它不是,正是分散式系統失敗的方式。

一個新 App 用一個迴圈、做 50 個各自獨立的遠端呼叫去取得一位使用者的 50 個好友,以為每個都「瞬間完成」。在開發者筆電上對一台本機伺服器說話時,感覺沒問題;上了正式環境,每個呼叫都帶著真實的延遲穿過網路,整頁要花十秒才載入。謬誤 2(延遲為零)咬了他們——修法是用一次呼叫把 50 個全部取回。

一份關於網路、令人安心的謊言檢核表。相信其中任何一條,都會蓋出一個脆弱的系統。

這些不是冷僻的邊角案例——它們是預設會犯的錯。心態上的修正,是別再把遠端呼叫當成本機呼叫:假設它可能遺失、變慢、不安全、又昂貴,並從一開始就為此設計。

又稱
the eight fallacies分散式運算謬誤八大謬誤