天天看點

通信協定與序列化方案的糾結: Protocol Buffer, Thrift or Hessian

原文:http://www.beyondlinux.com/2011/06/02/%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AE%E4%B8%8E%E5%BA%8F%E5%88%97%E5%8C%96%E6%96%B9%E6%A1%88%E7%9A%84%E7%BA%A0%E7%BB%93-protocol-buffer-thrift-or-hessian/

最早我用 hessian 作為 java 搜尋服務中的通信協定和序列化方案。松耦合,部署,調用友善。這兩年很多人跟我提起 protocol buffer,thrift。特别是最近從不少地方的資訊看到很多地方在用,也找到一些改用 protocol buffer 或者apache thrift的理由:

1.在趨勢科技的時候,病毒清理引擎裡面用的也是 protocol buffer 作為序列化,實際上在 Trend,PB用的很廣泛。

2. Jeff Dean 推薦分布式系統中使用 Protocol Description Language。 (理由是協定描述語言支援接口的版本演進,即可以自動忽略不認識的屬性,但不是如很多中文文章翻譯中所說的為了減少通信的代碼量。)

參考:

http://www.parallellabs.com/2010/12/02/jeff-dean-on-google-system-architecture/

http://peopleyun.com/?p=794

3.Quora也 在用 Protocol Buffer。參考Quora’s Technology Examined

更為重要的是,在我們項目中 .net 以 hessian 協定調用 java 的過程中多次出現接口中的類版本變化,導緻無法調用,且 hessian 并不顯示有提示作用的錯誤資訊。 調試和定位問題相當的困難和耗時。是以決定嘗試 PB 和 thrift, 對比了兩者, 發現 thrift 更好用。

1. thrift 支援 map

2. thrift 提供各種語言的 RPC 實作,不用另外再寫 RPC 伺服器。

3. thrift 官方原生版本可以自動生成各種語言的用戶端,大大減少開發工作量。

參考 ”thrift與protocol buffer的比較“

(注意兩點,1.有評論者說 thrift runtime 不支援 windows,實際上現在支援的 2.另一個說開始的測試結果表明 hessian 比 PB 要快,但後來重新測試PB要快。)

但不友善的是 thrif t也同 protocol buffer 一樣,需要編寫定義檔案, 需要生成代碼, 代碼中有一堆生成的方法和屬性, 不如直接使用Hessian友善, 使用hessian的時候, 要開放服務的接口中壓根就不需要增加任何額外的方法和屬性。

使用 hessian 過程中,最大的問題在于前面所描述的,.net 調用 java hessian 服務,當接口中的類版本有變化時,會調用失敗。但 java 調用 java hessian 并沒有這個問題。

後來到 stackoverflow 上查關于 hessian, protocol, buffer 的選擇問題, stackoverflow 上幾個人推薦使用簡潔、清晰、松耦合的 hessian。最終決定仍然使用 hessian,不迷信 google,迷信quora,不再考慮使用 thrift/java。

總結在幾者之間選擇的考量:

  1. 如果你不需要很多語言互相調用, 希望保持清晰的 java 接口代碼(無任何業務不相關的接口繼承和方法,屬性定義),減少開放工作量,推薦 hessian。
  2. 如果你的系統之間傳輸的資料量不是很大(<2M都不算大), 推薦 hessian。
  3. 如果需要支援大資料量的傳輸,多語言調用,極高的并發支援,推薦使用 thrift/protocol buffer。 通常我們并發很難超過1000 req/s,如果超過1000 req/s,在國内網際網路排名絕對前5,那麼恭喜你。是以一般而言,用 hessian 就夠了。 Conclusion: don't bother me with Protocol Buffer or Thrift.

REFER:

精通Dubbo——Dubbo支援的協定的詳解

https://blog.csdn.net/fuyuwei2015/article/details/72848310

Apache Thrift - 可伸縮的跨語言服務開發架構

https://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/index.html

gRPC vs REST

https://www.jianshu.com/p/34acb53d656b

http://hessian.caucho.com/#Java

https://github.com/grpc

https://github.com/alipay/sofa-hessian

https://github.com/protostuff/protostuff

https://msgpack.org

https://github.com/alibaba/fastjson