介紹
有 Facebook 開發的遠程服務調用框架采用接口描述語言定義并創建服務,支持可拓展的跨語言服務開發,所包含的代碼生成引擎尅一在多種語言中,如 C++,Java,Pyhon,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,Smalltalk 等創建搞笑的、無縫的服務,其傳輸數據采用二進制格式,相對 XML 和 JSON 體積更小,對于高并發、大數據量和多語言的環境更有優勢。
Thrift 架構
圖中黃色部分是用戶實現的業務邏輯,褐色部分是根據 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 文件,生成各種語言代碼