RPC调用框架比较分析
什么是RPC:
RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。
簡言之,RPC使得程序能夠像訪問本地系統資源一樣,去訪問遠端系統資源。
比較關鍵的一些方面包括,通訊協議,序列化,資源(接口)描述,服務框架,性能,語言支持等。
典型RPC調用框架:
RPC的實現和調用框架,五花八門,簡單介紹其中幾種比較典型的。
RMI實現,利用java.rmi包實現,基于Java遠程方法協議(Java Remote Method Protocol)
和java的原生序列化。
Hessian,是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能。 基于HTTP協議,采用二進制編解碼。
protobuf-rpc-pro是一個Java類庫,提供了基于 Google 的 Protocol Buffers 協議的遠程方法調用的框架。基于 Netty 底層的 NIO 技術。支持 TCP 重用/ keep-alive、SSL加密、RPC 調用取消操作、嵌入式日志等功能。
THRIFT是一種可伸縮的跨語言服務的軟件框架。它擁有功能強大的代碼生成引擎,無縫地支持C + +,C#,Java,Python和PHP和Ruby。thrift允許你定義一個描述文件,描述數據類型和服務接口。依據該文件,編譯器方便地生成RPC客戶端和服務器通信代碼。???
>>>最初由facebook開發用做系統內個語言之間的RPC通信 。
>>>2007年由facebook貢獻到apache基金 ,現在是apache下的opensource之一 。
>>>支持多種語言之間的RPC方式的通信:php語言client可以構造一個對象,調用相應的服務方法來調用java語言的服務 ,跨越語言的C/S RPC調用 。
>>>底層通訊基于SOCKET。
AVRO,Avro出自Hadoop之父Doug Cutting, 在Thrift已經相當流行的情況下Avro的推出,其目標不僅是提供一套類似Thrift的通訊中間件更是要建立一個新的,標準性的云計算的數據交換和 存儲的Protocol。支持HTTP,TCP兩種協議。
RPC調用框架的過程原理基本類似,以Thrift為例
Thrift 協議棧 以及各層的使用(java 為例)
1、model?? interface
服務的調用接口以及接口參數model、返回值model
2、Tprotocol??? 協議層
將數據(model)編碼 、解碼 。
3、Ttramsport 傳輸層
編碼后的數據傳輸(簡單socket、http)
5、Tserver
服務的Tserver類型,實現了幾種rpc調用(多線程、單線程非阻塞IO、多線程非阻塞IO)
RPC調用框架比較:
Thrift與protobuf-rpc-pro比較
1、Another important difference are the languages supported by default.???
protobuf: Java, C++, Python???
Thrift: Java, C++, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, Ocaml
支持語言不同,thrift支持著更多的語言
2、Thrift supports ‘exceptions 。
thrift支持服務的異常 。
3、Protocol Buffers much easier to read 。Protobuf API looks cleaner, though the generated classes are all packed as an inner classes which is not so nice.
Protocol Buffers 在文檔方面比thrift豐富,而且比thrift簡單 。
4、Protobuf serialized objects are about 30% smaller then Thrift.
Protocol Buffers在序列化/反序列化、傳輸上性能更優 。
5、RPC is another key difference. Thrift generates code to implement RPC clients and servers wheres Protocol Buffers seems mostly designed as a data-interchange format alone.?
thrift提供了一套完整的rpc服務實現(多線程socket、單線程非阻塞的socket、多線程非阻塞socket)
6、And according to the wiki the Thrift runtime doesn't run on Windows.
thrift 對有些語言在windows上不支持:C++??
摘選自:?http://gemantic.iteye.com/blog/1199214?thrift的使用介紹
Apache Avro 與 Thrift 比較
轉自網絡,http://www.360doc.com/content/12/0515/08/2716732_211104190.shtml
文章有比較詳細的對比,值得仔細研讀。摘部分內容,如下。
Avro和Thrift都是跨語言,基于二進制的高性能的通訊中間件. 它們都提供了數據序列化的功能和RPC服務. 總體功能上類似,但是哲學不一樣. Thrift出自Facebook用于后臺各個服務間的通訊,Thrift的設計強調統一的編程接口的多語言通訊框架. Avro出自Hadoop之父Doug Cutting, 在Thrift已經相當流行的情況下Avro的推出,其目標不僅是提供一套類似Thrift的通訊中間件更是要建立一個新的,標準性的云計算的數據交換和 存儲的Protocol。 這個和Thrift的理念不同,Thrift認為沒有一個完美的方案可以解決所有問題,因此盡量保持一個Neutral框架,插入不同的實現并互相交互。 而Avro偏向實用,排斥多種方案帶來的 可能的混亂,主張建立一個統一的標準,并不介意采用特定的優化。Avro的創新之處在于融合了顯式,declarative的Schema和高效二進制的 數據表達,強調數據的自我描述,克服了以往單純XML或二進制系統的缺陷。Avro對Schema動態加載功能,是Thrift編程接口所不具備的,符合 了Hadoop上的Hive/Pig及NOSQL 等既屬于ad hoc,又追求性能的應用需求。
目前階段Thrift比Avro支持的語言更豐富.
Thrift: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk.
Avro: C, C++, Java, Python, Ruby, PHP.
Avro和Thrift處理Schema方法截然不同。
Thrift是一個面向編程的系統, 完全依賴于IDL->Binding Language的代碼生成。
Avro支持2種方式。Avro-specific方式和Thrift的方式相似,依賴代碼生成產生特定的類,并內嵌JSON Schema. Avro-generic方式支持Schema的動態加載,用通用的結構(map)代表數據對象,不需要編譯加載直接就可以處理新的數據源。
Avro的Schema文件有三種格式,依次是avdl,avpr,avsc,后兩種是json格式,avdl可以轉成avpr。
java -jar avroj-tools.jar idl src/test/idl/input/namespaces.avdl /tmp/namespaces.avpr關于序列化,avro的機制,有更好的數據的透明度和可操作性,更高的存儲效率。
Thrift提供了多種序列化的實現:
TCompactProtocol: 最高效的二進制序列化協議,但并不是所有的綁定語言都支持。
TBinaryProtocol: 缺省簡單二進制序列化協議.
RPC服務
Avro提供了
HttpServer : 缺省,基于Jetty內核的服務.
NettyServer: 新的基于Netty的服務.
Thrift提供了:
TThreadPolServer: 多線程服務
TNonBlockingServer: 單線程 non blocking的服務
THsHaServer: 多線程 non blocking的服務
性能測試Benchmarking,兩者差相仿佛。
Conclusion
Thrift適用于程序對程序靜態的數據交換,要求schema預知并相對固定。
Avro在Thrift基礎上增加了對schema動態的支持且性能上不輸于Thrift。
Avro顯式schema設計使它更適用于搭建數據交換及存儲的通用工具和平臺,特別是在后臺。
目前Thrift的優勢在于更多的語言支持和相對成熟
比較分析結論:
基于以上三種框架比較分析,個人決定采用AVRO框架。
相關資源
protobuf-rpc-pro-demo-1.1.0及源碼 包含在附件中,該文件包中,包含一個1.1.0版本的運行環境(bin,lib中)以及最新3.3版本的demo源碼和protobuf-rpc-pro源碼。相關代碼在官網都可以下載到,?http://code.google.com/p/protobuf-rpc-pro/
protobuf-rpc-readme,個人的一點總結
thrifttest源碼,包含在附件中,該項目包含一個rmi的實現,以及thrift的實現。
Avrotest源碼,包含在附件中,該項目包含官網提供的一個數據序列化反序列化的兩種實現,SpecificMain,GenericMain;Specific方式的接口調用MailMain*;Generic方式的多接口調用,包含http方式和netty方式,http/,netty/;項目涵蓋了三種不同的Schema格式。
- 本文附件下載:
- tech_blog.zip?(4.5 MB)
總結
以上是生活随笔為你收集整理的RPC调用框架比较分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: frame buffer编程--画点功能
- 下一篇: SFB2015 多SIP域