跨語言通訊方案比較

工程師WWW發表於2014-03-27

常用的跨語言通訊方案:

  • 基於SOAP訊息格式的WebService
  • 基於JSON訊息格式的RESTful 服務

以上兩種方案的弊端:

  • XML體積太大,解析效能極差
  • JSON體積相對較小,解析相對較快,但表達能力較弱

於是探索一下現在比較流行的跨語言通訊方案:

Google protobuf

Protocol Buffers是Google公司開發的一種資料描述語言
可用於資料儲存、通訊協議等方面,它不依賴於語言和平臺並且可擴充套件性極強。
現階段官方支援C++、JAVA、Python等三種程式語言,但可以找到大量的幾乎涵蓋所有語言的第三方擴充包。
訊息格式定義採用proto檔案

應用

  • Google內部

優點

  • 二進位制訊息,效能好/效率高(空間和時間效率都很不錯)
  • proto檔案生成目的碼,簡單易用
  • 序列化反序列化直接對應程式中的資料類,不需要解析後在進行對映(XML,JSON都是這種方式)
  • 支援向前相容(新加欄位採用預設值)和向後相容(忽略新加欄位),簡化升級
  • 支援多種語言(可以把proto檔案看做IDL檔案)
  • Netty等一些框架整合

缺點

  • 官方只支援C++,JAVA和Python語言繫結
  • 二進位制可讀性差(貌似提供了Text_Fromat功能)
  • 二進位制不具有自描述特性
  • 預設不具備動態特性(可以通過動態定義生成訊息型別或者動態編譯支援)
  • 只涉及序列化和反序列化技術,不涉及RPC功能(類似XML或者JSON的解析器)

Apache Thrift

Thrift是Facebook實現的一種高效的、支援多種程式語言的遠端服務呼叫的框架,
現在已經轉到Apache組織下,提供資料序列化的功能和RPC服務能力。
支援 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等語言
訊息格式定義採用thrift檔案

應用

優點

  • 支援非常多的語言繫結
  • thrift檔案生成目的碼,簡單易用
  • 訊息定義檔案支援註釋
  • 資料結構與傳輸表現的分離,支援多種訊息格式
  • 包含完整的客戶端/服務端堆疊,可快速實現RPC
  • 支援同步和非同步通訊

缺點

  • 和protobuf一樣不支援動態特性

Apache Avro

Avro出自Hadoop之父Doug Cutting,
目標是推出標準性的雲端計算的資料交換和儲存的Protocol
支援 C, C++, Java, Python, Ruby, PHP
訊息格式定義採用JSON描述

應用

優點

  • 二進位制訊息,效能好/效率高
  • 使用JSON描述模式
  • 模式和資料統一儲存,訊息自描述,不需要生成stub程式碼(支援生成IDL)
  • RPC呼叫在握手階段交換模式定義
  • 包含完整的客戶端/服務端堆疊,可快速實現RPC
  • 支援同步和非同步通訊
  • 支援動態訊息
  • 模式定義允許定義資料的排序(序列化時會遵循這個順序)
  • 提供了基於Jetty核心的服務基於Netty的服務

缺點

  • 只支援Avro自己的序列化格式
  • 語言繫結不如Thrift豐富

相關文章