Table of Contents
遠程服務調用**(Remote Procedure Call, RPC)**
進程間通訊(Inter-Process Communication, IPC)
- “遠程服務調用” 一開始就是為了讓電腦能夠跟調用本地方法一樣地去調用遠程方法,以達成 “透明調用” 的效果。
- “調用遠程方法“ 相當於要解決 “兩個進程之間如何交換數據” 的問題,也就是 ”進程間通訊“。
- 在同一台主機上,“進程間通訊” 的種類主要有以下:
- 管道 (Pipe) 或 具名管道 (Named Pipe):類似於兩個進程間的橋樑,可以傳遞少量的字節或字節流。
- 訊號 (Signal):用於通知目標進程有某個事件即將發生。
- 訊號量 (Semaphore):用於兩個進程之間同步協作的手段。
- 訊息隊列 (Message Queue):進程可以向隊列添加訊息,被賦予讀取權限的進程可以從隊列中消費訊息(即時性相對受限)。
- 共享內存 (Shared Memory):允許多個進程訪問同一塊公共的內存空間。
- 套接字接口 (?) (Socket):比上面那兩個更適合普遍使用在不同機器之間的進程通訊。當僅限於在本地端的進程間通訊時,Socket 還會被優化。
通訊的成本
- Socket 同時能支援本地端與跨機器的不同進程間的通訊,且是各個作業系統都有提供的標準接口,把 “遠程調用方法” 的通訊細節藏在作業系統底層,可以做到與本地的進程間通訊在編碼上一致。
- 但如此的 “透明調用” 反而讓大家誤會 “通訊是無成本的“,因此被濫用而導致分布式系統的效能被嚴重降低。
- 將本地調用與遠程調用當作一樣處理,或是說把系統間的調用做成透明,反而會增加程序員的工作複雜度。
- 《透過網路進行分布式運算的八宗罪》,如果遠程服務調用要弄成透明的話,就必須為這些罪買單。
(不過後續還是有人站出來,起草了 RPC 的協議)
遠程服務調用 (RPC)
是指位於互不重合的內存地址空間中的兩個程序,在語言層面上,以同步的方式使用帶寬有限的信道來傳輸程序控制訊息。
三個基本問題
DCE/RPC 與 ONC RPC (Sun RPC) 以及後續所流行過的 RPC,不外乎都是為了解決以下三個問題:
- 如何表示數據:這裡的數據包含傳遞給方法的參數,以及方法執行後的回傳值。有效的做法是 “序列與反序列化”:將交互雙方所涉及的數據轉換為某種事先約定好的中立數據流格式來進行傳輸,將數據流轉換回不同語言中對應的數據類型來進行使用。
- 如何傳遞數據:如何透網路,在兩個服務的 Endpoint 之間互相操作、交換數據。許多與業務邏輯之外的數據,如異常、超時、安全、認證、授權、事務等等,都可能產生雙方需要交換訊息的需求。兩個 Endpoint 之間交換這類數據的行為,稱為《Wire Protocol》。