從本章起,全書由「原理」的討論轉入各種用來組織分散式系統的典範(paradigm),第一個典範就是分散式物件。在分散式物件系統中,「物件」是建立分佈透明性的關鍵:原則上一切皆物件,服務與資源都以可呼叫的物件形式提供給用戶端。
分散式物件之所以重要,原因有二:
- 分佈面向相對容易藏在物件介面之後——介面與實作分離,天然適合隔開「在哪裡執行」與「做什麼」。
- 物件幾乎可以是任何東西——因此是建構系統的強大典範。
本章逐一檢視分散式系統的各項原理如何落實在知名的物件式系統上,涵蓋 CORBA、Java 系(RMI、EJB、JVM 容錯)與 Globe。
本章重點#
- 架構:多數系統採遠端物件模型——狀態集中於單機、介面透過 proxy/skeleton 外放;Globe 則支援狀態可實體分散與複製的分散式共享物件。
- 行程:物件伺服器本身不提供服務,服務由駐留的物件實作;活化政策由 object adapter 分組管理,servant 泛指物件實作的程式碼;物件的狀態與程式碼常在執行期才載入。
- 通訊:主要手段是遠端方法呼叫(RMI),與 RPC 的關鍵差異在於全系統物件參考,解決了許多妨礙 RPC 存取透明性的參數傳遞問題。參考的實作光譜很寬——從描述聯絡位置的被動資料結構,到 Java RMI 採用的可攜程式碼(proxy 即參考)。CORBA 訊息服務展示了如何在「一切皆物件呼叫」的約束下做非同步與持久通訊。
- 命名:CORBA 的 IOR 是直接參考(內含聯絡資訊);Globe 的 OID 是真識別碼,需經定位服務換取聯絡位址(間接參考)。
- 同步:多數系統沒有特別措施。重要例外是 Java 的 synchronized 方法——同步只發生在同一機器的用戶端之間,跨機器的用戶端得自行處理,且不屬於語言的一部分。
- 一致性與複製:入口一致性是分散式物件的自然模型(每物件一把鎖);物件被當黑盒子看待,使複製呼叫問題更為突出。
- 容錯:大體沿用一般分散式系統的做法;CORBA 以物件群組+ IOGR 提供最完整的標準化,Java 陣營則嘗試把 JVM 變成決定性有限狀態機以支援主動式複製。
- 安全:核心是安全方法呼叫。Globe 是把它一般化到複製物件的完整範例,並示範政策與機制可以乾淨分離(認證與授權皆然);用戶端須從目錄服務下載 proxy 的系統(如 Java)需要特別留意。