Thrift 和 Protobuf

weixin_33724059發表於2019-01-29

介紹

有 Facebook 開發的遠端服務呼叫框架採用介面描述語言定義並建立服務,支援可擴充的跨語言服務開發,所包含的程式碼生成引擎尅一在多種語言中,如 C++,Java,Pyhon,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,Smalltalk 等建立搞笑的、無縫的服務,其傳輸資料採用二進位制格式,相對 XML 和 JSON 體積更小,對於高併發、大資料量和多語言的環境更有優勢。

Thrift 架構

3445275-eb31c916eedca5bb.png

圖中黃色部分是使用者實現的業務邏輯,褐色部分是根據 Thrift 定義的服務介面描述檔案生成的客戶端和伺服器端程式碼框架,紅色部分是根據 Thrift 檔案生成程式碼實現資料的讀寫操作。紅色部分以下是 Thrift 的傳輸體系、協議以及底層 I/O 通訊,使用 Thrift 可以很方便的定義一個服務並且選擇不同而傳輸協議和傳輸層而不用重新生成程式碼。

優缺點

優點

  • One-stop shop,相對於 protobuf,序列化和 RPC 支援一站式解決,如果是 protobuf,還需要考慮 RPC 框架。

protobuf
google 開源的一個專案,主要用於資料儲存、傳輸協議格式等場合。也是一個二進位制協議,主要用來序列化。

  • 特性豐富
  • RPC 和序列化效能不
  • 有很多開源專案的周邊支援 都是 thrift
    ...

缺點

  • 沒有官方文件
  • Thrift 序列化二進位制不可讀,除錯相對困難
  • Thrift 的序列化和框架緊耦合,無法支援向持久層直接讀寫資料,所以不適合做資料持久化協議
  • RPC 在 0.6.1 升級到 0.7.0 是不相容的
  • buf fix 和更新不積極,維護成本過高
    ...

Thrift 和 Protobuf 運用場景

Thrift

對於需求為高效能,分散式的 RPC 服務,Thrift 支援眾多語言和豐富的資料型別,並對於資料欄位的增刪具有較強的相容性,所以非常適合公司內部 SOA 的標準 RPC 框架

Protobuf

Protobuf 具有廣泛的使用者基礎,空間開銷小一級高解析性是其亮點,非常適合於公司內部的對效能要求高的 RPC 呼叫。Protobuf 提供了標準的 IDL 以及對應編譯器,其 IDL 檔案是參與各方的非常強的業務約束,另外,Protobuf 與傳輸層無關,採用 Http 具有良好的跨防火牆的訪問屬性。由於其解析效能好,序列化後資料量相對少,非常適合應用層物件的持久化場景。

IDL 介面描述語言Interactive Data Language
這是一種描述語言,也是一箇中間語言,IDL 一個使命就是規範和約束,規範使用型別,提供跨語言特性。通過工具分析 IDL 檔案,生成各種語言程式碼

Apache Thrift - 可伸縮的跨語言服務開發框架
序列化和反序列化-劉丁

相關文章