傳統的跨語言通訊方案:
基於SOAP消息格式的WebService
基於JSON消息格式的RESTful 服務
主要弊端:
XML體積太大,解析性能極差
JSON體積相對較小,解析相對較快,但表達能力較弱
如今比較流行的跨語言通訊方案:
Google protobuf (http://code.google.com/p/protobuf)
Apache Thrift (http://thrift.apache.org/)
Google protobuf:
優勢
二進制消息,性能好/效率高(空間和時間效率都很不錯)
proto文件生成目標代碼,簡單易用
序列化反序列化直接對應程序中的數據類,不須要解析後在進行映射(XML,JSON都是這種方式)
支持向前兼容(新加字段採用默認值)和向後兼容(忽略新加字段),簡化升級
支持多種語言(能夠把proto文件看作IDL文件)
Netty等一些框架集成
缺點
官方只支持C++,JAVA和Python語言綁定
二進制可讀性差(貌似提供了Text_Fromat功能)
二進制不具備自描述特性
默認不具有動態特性(能夠經過動態定義生成消息類型或者動態編譯支持)
只涉及序列化和反序列化技術,不涉及RPC功能(相似XML或者JSON的解析器)
Apache Thrift:
應用
Facebook的開源的日誌收集系統(scribe: https://github.com/facebook/scribe)
淘寶的實時數據傳輸平臺(TimeTunnel http://code.taobao.org/p/TimeTunnel/wiki/index)
Evernote開放接口(https://github.com/evernote/evernote-thrift)
Quora(http://www.quora.com/Apache-Thrift)
HBase( http://abloz.com/hbase/book.html#thrift )
…
優勢
支持很是多的語言綁定
thrift文件生成目標代碼,簡單易用
消息定義文件支持註釋
數據結構與傳輸表現的分離,支持多種消息格式
包含完整的客戶端/服務端堆棧,可快速實現RPC
支持同步和異步通訊
缺點
和protobuf同樣不支持動態特性
Apache Avro:
應用
Hadoop RPC (http://hadoop.apache.org/#What+Is+Apache+Hadoop%3F)
優勢
二進制消息,性能好/效率高
使用JSON描述模式
模式和數據統一存儲,消息自描述,不須要生成stub代碼(支持生成IDL)
RPC調用在握手階段交換模式定義
包含完整的客戶端/服務端堆棧,可快速實現RPC
支持同步和異步通訊
支持動態消息
模式定義容許定義數據的排序(序列化時會遵循這個順序)
提供了基於Jetty內核的服務基於Netty的服務
缺點
只支持Avro本身的序列化格式
語言綁定不如Thrift豐富