互聯網的發展,應用的規模不斷擴大,導致各行業對於數據庫處理能力需求不斷增長,數據庫橫向擴展需求以及頻繁的跨節點操作需求隨之提升,用戶對於數據庫RPC能力提出較高要求。那麼,RPC是什麼?RPC能夠解決什麼問題?本篇將以KingbaseES中的RPC爲例向大家進行系統介紹。

RPC是什麼

RPC是遠程過程調用(Remote Procedure Call)的縮寫,論文《Implementing remote procedure calls》最早提出了RPC的概念。RPC提供了

完成遠程調用的能力而且不損失本地調用的語義

經典的RPC過程

KingbaseES在各類集羣架構中都需要跨節點的操作,KingbaseES實現了RPC能力以便這些需要跨節點操作可以被更簡單的實現。

RPC解決的問題

爲了透明的實現遠程調用,RPC需要解決以下問題:

1.client如何從server端獲取可用的接口列表

不同於各類RPC框架,

KingbaseES的RPC只用於產品內部

,原則上可以在編譯時導出列表。但KingbaseES的集羣部署中需要在升級時保持節點間的互操作性以支持滾動升級,所以也支持了動態獲取接口列表並支持向前兼容。

2.client和server端的連接建立

由於只需支持節點間的連接,目前選擇在部署自動生成節點間的連接配置。

3.傳輸協議選擇

選擇還是基於開發的便利性,基於KingbaseES本身使用了TCP/IP協議的原生接口,

可以基於已有的代碼簡單封裝

4.調用的參數傳輸

a)參數序列化

KingbaseES提供各類基礎數據類型的參數傳輸,包括傳值參數(定長數據類型)和引用參數(指針+長度的形式)。

b)在支持跨平臺部署的產品中,處理不同字節序主機間的參數傳輸

目前的RPC支持了定長類型的字節序透明處理。

5.通信連接模型選擇

a)一進程一連接

每個client進程獨佔一個到server進程的連接。這種模型優點是獨佔連接可以保證每個client的請求不互相影響可以及時處理,缺點是在連接規模增加時,進程的上下文切換會越來越頻繁,性能損耗大。

數據庫經常會處理高併發,保有千級別的活動連接,在集羣架構下這種模型的連接數也會隨着節點數增加而增長,造成巨大的性能損耗。

b)多進程一連接

A模型的優化版本,爲了減少連接數,多個client進程連接到本節點的一個通信進程,通信進程連接到一個server進程。server進程根據會循環接收報文,然後根據收到的報文進程內調用過程的handler。這種模型優化了連接數,但單個server進程處理請求上容易發生瓶頸,一個請求的響應時間超長就會阻塞全部請求。

c)多進程多連接

B模型的優化版本,通過增加通信進程數量增加吞吐量。

基於KingbaseES集羣目前支持的節點數量和每個節點的連接數,RPC實現選擇了模型C。

大部分的RPC處理都是延遲很小的操作,不會出現對於單個調用阻塞一個連接的情況,對於少數需要I/O或封鎖等待的操作,選擇在Server端實現異步調用避免等待。

6.RPC和本地調用的語義差異

RPC故障情況下的語義和本地調用不同,KingbaseES選擇瞭如下的RPC語義

a)本發送成功前的錯誤按調用錯誤處理

b)發送後有返回的情況下,返回值正確描述server端執行的結果

c)發送後網絡超時或錯誤時, 支持重試直到收到節點變更通知或完成重試,完成至少一次的調用語義。client需要根據調用的冪等性選擇。

相關文章