技術觀念 | 淺談分散式系統 - IPC 與 RPC
分散式系統中有大量的節點,各節點結構不同、功能各異,如何相互通信,並協同作業以完成系統目標,是一個很大的課題,而這個課題的核心就是——IPC !
IPC(Inter-process communication)就是進程間通信,進程是基本的計算單元,是分散式系統中的基本節點。在開發多進程和分散式系統時,需要設計和選擇合理有效的 IPC 方案。
什麼是 IPC ?
行程間通訊(IPC,Inter-Process Communication),指至少兩個行程或執行緒間傳送資料或訊號的一些技術或方法。
行程是電腦系統分配資源的最小單位(嚴格說來是執行緒)。每個行程都有自己的一部分獨立的系統資源,彼此是隔離的。為了能使不同的行程互相存取資源並進行協調工作,才有了行程間通訊。通常,使用行程間通訊的兩個應用可以被分為客戶端和伺服器(見主從式架構),客戶端行程請求資料,伺服器端回應客戶端的資料請求。有一些應用本身既是伺服器又是客戶端,這在分散式計算中,時常可以見到。這些行程可以執行在同一電腦上或網路連接的不同電腦上。
IPC對微核心和nano核心的設計過程非常重要。微核心減少了核心提供的功能數量。 然後通過IPC與伺服器通訊獲得這些功能,與普通的單片核心相比,IPC的數量大幅增加。
分散式系統通過 IPC 來實現組件或子系統之間的通信,IPC 分為兩類:面向資料(data-centric) vs 面向消息(Message passing)。基於 Socket 的消息傳輸是分散式系統中最主要的通信方式,分為 RPC 和 Web Services 兩大類。 RPC 是面向函數的消息傳遞方式,Web Services 是面向服務的訊息傳遞方式。
現代訊息技術的起點是什麼? —— 是通信!從電話,電報,無線廣播,到電信系統,蜂窩通信,3G,4G,5G,網際網路通信。通信是訊息技術的骨架,軟體出現的很晚,程控交換機直到上世紀70年代才出現。
- 人工交換機
- 步進制電話交換機
- 程控交換機
計算機普出現之後,有了軟體和軟體系統,軟體系統互聯,就是分散式系統!
架構 = 節點 + 關係,在軟體開發中,節點可以是函數,類,也可以是模組,庫,子系統;關係就是函數調用和 IPC。函數調用和IPC 本質上是有關資料傳輸/資料共享的問題,傳什麼(資料格式,xml?json?binary?string?),用什麼傳(tcp?http?),傳到哪裡(路由、尋址),同步還是異步?等等。
通信是系統的骨架,所以 IPC 很重要!
做系統/框架開發(c語言)的同學,可能對 IPC 更熟悉一些,比如 UNIX域套接字就常用於在同一台機器上運行的進程之間的通信。 UNIX域資料報服務是可靠的,既不會丟失消息也不會傳遞出錯。
什麼是 RPC ?
在分散式計算,遠端程序呼叫(英語:Remote Procedure Call,縮寫為 RPC)是一個電腦通信協定。該協定允許執行於一台電腦的程式呼叫另一個位址空間(通常為一個開放網路的一台電腦)的子程式,而程式設計師就像呼叫本地程式一樣,無需額外地為這個互動作用編程(無需關注細節)。RPC是一種伺服器-客戶端(Client/Server)模式,經典實現是一個通過傳送請求-接受回應進行資訊互動的系統。
如果涉及的軟體採用物件導向程式設計,那麼遠端程序呼叫亦可稱作遠端呼叫或遠端方法呼叫,例:Java RMI。
RPC是一種行程間通信的模式,程式分布在不同的位址空間里。如果在同一主機里,RPC可以通過不同的虛擬位址空間(即便使用相同的實體位址)進行通訊,而在不同的主機間,則通過不同的物理進行互動。許多技術(常常是不相容)都是基於這種概念而實現的。
正如上面的敘述,RPC簡單說就是一台機器上面的程式將自己的function expose出來,透過網路介面接受另外一台機器上面的程式呼叫。
因此我們稱提供functions的為server,呼叫的為client。
步驟也非常直觀:
- Client就像是呼叫本地的function一樣直接使用該function
- 但是其實該function並不是真的,他底部會先將使用者的一些metadata與參數做encoding的動作,可以是JSON/XML/binary stream…等
- 接著再透過網路介面TCP/UDP/HTTP將訊息傳給真正提供function的Server
- Server接收到後將訊息decoding
- Server真正的呼叫真實的function,並得到return的結果
- Server將結果encoding後再將結果送回Client
- Client decoding後得到結果
此方法將function抽象出來,對Client來說他以為他是呼叫本地function(寫code時也是一樣的感覺),然後得到return值
但是其實底層是將參數傳到另外一台機器上並使用那一台機器的function得到結果回傳。
- RPC 的核心問題:
- 通信協議:TCP or HTTP,短連接 or 長連接?連接共享?同步與異步?
- 服務註冊:服務註冊(RMI Registry),WSDL
- 尋址:服務地址 = 主機+端口+服務名稱,URI, UDDI
- 資料序列化(Serialize)或編組(Marshal)
- 版本控制:服務接口的擴展
- RPC 的協議有很多,比如最早的 CORBA,Java RMI,Hessian,Thrift,gRPC,SOAP。
- Dubbo: 來自阿里巴巴 http://dubbo.I/O/
- gRPC by Google http://www.grpc.I/O (Google inside use Stuppy)
- Thrift from facebook https://thrift.apache.org
- Avro from hadoop https://avro.apache.org
RPC 的概念從函數調用衍化而來,而函數是一個編程概念,是程序員所關心的事物,也可以理解為 RPC 是從程序員的角度上提出的 IPC 方案,是程序員友好的!與之相對的概念就是服務(Service),服務是面向業務的,更上層。由此可見,RPC 是一種技術方案,而 SOA 是一種架構思想;RPC 是面向編程的概念,而 SOA 是面向業務和設計的概念。
註:以上參考了
漫谈分布式系统中的技术 —— 从 IPC/RPC,SOA,Web Service/REST 到 micro services(微服务)
認識程序與IPC架構
IPC和RPC的区别和联系
行程間通訊
遠端程序呼叫
分散式系統溝通的方法 - RPC