全python項目,使用protobufThrift適合嗎?
我現在在做一個全python的集群項目,用的xmlrpc去做各服務通信。
但是xmlrpc的使用太噁心,而且異常全部轉換成了xmlrpc的Fault類型。
很不好轉換,所以想吧我們的通信庫換一下。
但是其他人說,又不是跨語言,沒必要用到這些東西,簡單就行。
各位怎麼看呢?
protobuf只是一種serialization的協議,thrift才是一個完整的服務級別的rpc協議(最近grpc也開源了,基本等於Google的thrift,最近準備在go裡面玩玩兒)
其實用Thrift省事兒多了,thrift文件作為一個service model是語言無關的,而且可以同時生成server和client,還自帶type check。定義好介面,就可以專心去實現業務邏輯了。早些年仔細研究過protobuf和thrift,並分別分享過。
ProtoBuf開發者指南:
http://gashero.yeax.com/?p=108
在較長時期都是國內最全的一份翻譯。
thrift也做過一份1萬來字的文檔,但並沒有公布。
這兩種序列化技術我都在實際項目中用過,2010年前後。在這之後就沒有再用。
從序列化的角度,兩者相似程度很高,效率方面也都是頂級的水平,無論是存儲效率還是壓縮/解包效率。
至於RPC方面,截至到2010年,protobuf沒有官方的方案,thrift的則是線程池實現,經常卡死,很爛。所以至少那個時代,兩者用做RPC都不靠譜。
最關鍵的問題來自如下幾點:
1、難於調試:都是二進位協議,序列化後的內容不可讀
2、安裝繁瑣噁心:都要安裝很久,編譯一堆東西
3、對多語言支持有限:最近幾年新語言出的太快了
4、對WEB不友好:js沒有原生支持
所以,逐漸就不用了。現在遇到類似的需求都是用HTTP裡面封裝JSON的。所以調用的請求用form提交,這樣用網頁上的表單就能模擬。返回的是一個dict,其中errnum表示錯誤碼,0為成功。errmsg為錯誤信息,方便客戶端調試。result為實際返回的數據。
這樣的方式調試方便,兼容性好。雖然慢了不少,但其實人的效率更重要。
另外,年輕人要小心overdesign,也許你的應用終生都不會有大的性能壓力。可以,廠里一部分用的 Thrift
現在 RPC 通信框架里比較成熟的就是 Thrift 了,是用C++實現的,我呆了兩家互聯網公司,都用這個。最早是 Facebook 寫的,國內的話規模比較大的據我所知百度也在用。有個傳言的八卦是 protobuffer 是早期在 Google 內部流行的,後來有員工跳槽到了 Facebook 才有了 Thrift。
Thrift 的 RPC 框架中像 block, nonblock 的功能都有了,protobuf 好像一心一意做好自己的事情,只提供了序列化和反序列化的功能。 所以你說要我來做抉擇,肯定是上 Thrift。
況且,Thrift 一點也不複雜,定義一個傳輸介面的配置文件就完事了,後面的事情 Thrift 一條龍服務。你知道Thrift發布多少年了,至今版本號仍然只是 0.9.2 嗎?
老夫作為國內第一批吃螃蟹的,有半年基本上天天在幫別人解決thrift bug問題...後來果斷棄坑,加入微軟WCF大軍。protobuf我沒有用過,但是做過一些功課,它的python庫質量不錯,個人覺得如果不是很有針對性的,特別適合xml的,倒是真可以用它。
Thrift是我來現在的這家互聯網公司,開始接觸的,2007年Facebook發起的項目。
主要是用在後端 internal services,所在互聯網公司,thrift是後端服務RPC通信的基礎。對題主所在的項目應該是足夠的。
同樣也是基於python構建的主要後端服務,框架組開源了下面的對thrift封裝的庫,比較方便的構建服務和客戶端的接入。
eleme/thriftpy · GitHub
service PingPong {
string ping(),
}
1.構建server
import thriftpy
pingpong_thrift = thriftpy.load("pingpong.thrift", module_name="pingpong_thrift")
from thriftpy.rpc import make_server
class Dispatcher(object):
def ping(self):
return "pong"
server = make_server(pingpong_thrift.PingPong, Dispatcher(), "127.0.0.1", 6000)
server.serve()
2. client接入
import thriftpy
pingpong_thrift = thriftpy.load("pingpong.thrift", module_name="pingpong_thrift")
from thriftpy.rpc import make_client
client = make_client(pingpong_thrift.PingPong, "127.0.0.1", 6000)
client.ping()
PS:
微服務
主流互聯網公司的後端,現在都轉微服務的架構,量級各有不同。
現成的輪子
mfornos/awesome-microservices · GitHub
我們用c++寫thrift服務端,python寫thrift介面客戶端,在一個核心平台上使用,效果挺好。
我是非常推薦用 ProtoBuf 或者 Thrift 來通訊的,這樣能有個類型的檢查(類型是我們的好朋友)。
題主把 PB 和 Thrift 放到一起比較是想比較序列化的效率么?我沒有用過 Python 的 xmlrpc 也不好比較他們的效率,但是可以肯定的說 PB 或者 Thrift 的序列化效率是大於大部分的。
Thrift 其實應該是和 grpc 做比較的,畢竟 PB 只是個序列化協議而已,Thrift 是包含了 Protocol 以及 Transport 的。有人用zeroc ice嗎?
protobuf吧,挺好用的。
雖然我只知道protobuf。
首先指正下protocolbuffer僅僅是一個序列化和反序列化的協議,我覺得你可能想用grpc或者thrift來替換你們當前使用的xmlrpc。
grpc是出自大廠谷歌,持續維護和開發中,基於protocolbuffer進行序列化和反序列化,性能高有各路人士進行過對比,目前已經有1.0版本,基於http2進行數據傳輸,支持同步和非同步兩種模式,性能在各種優化中,有使用C++重寫部分邏輯,不過grpc應該只支持python2,另外就是protocolbuffer目前支持的數據類型可能不如thrift完善,不過開發普通場景的應用絕對沒有啥問題。
另thrift是出自Facebook,已經有好多年了積累了,由於這貨出生早所以很多早期的應用都有使用thrift,據說早年也是Google的員工離職到Facebook後才基於谷歌的rpc重新設計了thrift。
好了,背景扯完,個人兩種框架都有用過,你要是用這兩種來替換xmlrpc的話絕對沒有問題,在跨語言開發上兩個都有很豐富的積累,建議替換,要說這兩個中選擇其一的話建議使用grpc+protocolbuffer。
從性能來講,protobuf和thrift遠優於rpc-xml
最近被GRPC搞到瘋,我是不會告訴你GRPC不支持Python 3的,啊哈哈哈哈
thrift 有RPC。 protobuf 就今年Google剛開源grpc只不過還在alpha
有人用FlatBuffer嗎?
我想知道有人用這個嗎?
Cap"n Proto: Introduction
PS:有Python實現
Welcome to pycapnp』s documentation!
Thrift 發現一個坑 I32類型 二進位流unpark 後默認是0.怎麼判斷是空呢。
推薦閱讀:
※Haskell中的惰性求值如何實現?
※Facebook 新發布的 Hack 語言怎麼樣?
※「C++」讀作「C 加加」,為什麼「C?」不能讀作「C 井」呢?
※MFC 還在更新嗎?
※Swift 集成了哪些語言的特性?
TAG:編程語言 | Python | protobuf | Thrift | 遠程過程調用協議RPCRemoteProcedureCallProtocol |