RPC 框架設計

ice_image發表於2021-03-18

RPC 框架設計

初識 RPC

服務化有什麼好處?

  • 防止程式碼拷貝
  • 防止底層複雜性的擴散
  • 防止公共庫的耦合
  • 保證 SQL 的質量,能夠解除資料庫的耦合

什麼是 RPC

RPC:Remote Procedure Call Protocol,遠端過程呼叫協議,像呼叫本地函式一樣,去呼叫一個遠端服務。

相比“同一個程式”的“本地”函式呼叫,有沒有辦法,呼叫一個“跨程式”的“遠端”函式呢?

Socket 通訊,只能傳遞連續的位元組流,如何將 “入參/函式” 放到連續的位元組流裡呢?需要設計“應用層報文(協議)”

“跨程式”“遠端”呼叫的過程

RPC 框架的架構職責

上述跨程式呼叫遠端的服務,存在的問題是沒有將通用操作抽離出來。

RPC框架職責:

  1. 讓呼叫端,像呼叫本地函式一樣,便捷的呼叫遠端的服務
  2. 讓服務端,像提供本地函式一樣,便捷的提供遠端的服務

向呼叫方遮蔽各種複雜性,向服務方也遮蔽各種複雜性,讓呼叫方感覺上就是在呼叫本地函式一樣,來呼叫一個遠端的服務;讓服務方就像實現一個本地函式一樣,便捷地提供遠端服務。

序列化與反序列化

為什麼需要序列化?

需要將物件等資料進行二進位制轉儲。

所謂序列化,是將“物件”形態的資料轉化為“連續空間二進位制位元組流”形態資料的過程。

如何進行序列化?

如何將一個 class User 的記憶體實體 u1 轉化為二進位制位元組流?

  • 方案一:自描述

    自描述的標記性語言 (XML/JSON),來進行轉換。規定好轉換規則。

  • 方案二:序列化協議

    序號 | key 長度 | key 值 | value 長度 | value 值

序列化協議設計,要考慮什麼因素?

  1. 解析效率
  2. 壓縮率,傳輸有效性
  3. 擴充套件性,相容性
  4. 可讀性,可除錯性
  5. 跨語言
  6. 通用性

常見的序列化方法(協議)

  1. xml/json
  2. protobuf
  3. Avro
  4. CORBA
  5. mc_pack

位元組流傳送 + 位元組流接收

同步 RPC 系統架構,核心流程

RPC-server:IO執行緒,中間是一個佇列,工作執行緒處理結果,返回。

連線池元件

非同步 RPC 系統架構,核心流程

呼叫方呼叫,生成上下文,程式設計報文,放入佇列;呼叫結束

非同步架構,上下文管理器

  1. 為什麼需要上下文管理器?
  2. 如何將請求-響應-回撥等資訊匹配起來?

一條連線,非同步請求、響應報文如何匹配? 可以通過“請求ID”關聯!!!

通過“請求ID”關聯 請求-響應-回撥

非同步架構,超時管理器

RPC-Server

監聽一個埠,收發執行緒收發資料庫包,中間一個包佇列,工作執行緒來處理,整個 RPC-Server 就是一個比較簡單的生產者-消費者。

總結

  1. 什麼是 RPC?

    像呼叫本地函式一樣,去呼叫一個遠端服務

  2. 為什麼需要 RPC 框架?

    用來遮蔽 rpc 呼叫過程中,跟業務程式碼無關的底層技術細節

  3. 什麼是序列化?為什麼需要序列化?

    將物件轉換為二進位制流的過程

  4. 同步 RPC-Client 的核心元件是什麼?

    序列化/反序列化、連線池

  5. 非同步 RPC-Client 的核心元件是什麼?

    收發佇列(用於解耦)、工作執行緒、上下文管理器

相關文章