跨語言通訊方案比較
常用的跨語言通訊方案:
- 基於SOAP訊息格式的WebService
- 基於JSON訊息格式的RESTful 服務
以上兩種方案的弊端:
- XML體積太大,解析效能極差
- JSON體積相對較小,解析相對較快,但表達能力較弱
於是探索一下現在比較流行的跨語言通訊方案:
- Google protobuf (http://code.google.com/p/protobuf)
- Apache Thrift (http://thrift.apache.org/)
- Apache Avro (http://avro.apache.org/)
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檔案
應用
- 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
Avro出自Hadoop之父Doug Cutting,
目標是推出標準性的雲端計算的資料交換和儲存的Protocol
支援 C, C++, Java, Python, Ruby, PHP
訊息格式定義採用JSON描述
應用
優點
- 二進位制訊息,效能好/效率高
- 使用JSON描述模式
- 模式和資料統一儲存,訊息自描述,不需要生成stub程式碼(支援生成IDL)
- RPC呼叫在握手階段交換模式定義
- 包含完整的客戶端/服務端堆疊,可快速實現RPC
- 支援同步和非同步通訊
- 支援動態訊息
- 模式定義允許定義資料的排序(序列化時會遵循這個順序)
- 提供了基於Jetty核心的服務基於Netty的服務
缺點
- 只支援Avro自己的序列化格式
- 語言繫結不如Thrift豐富
相關文章
- 流行語言的比較 (轉)
- k語言和q語言的比較
- OC,swift,javascript,Dart語言比較SwiftJavaScriptDart
- Go語言的Web框架比較GoWeb框架
- 幽默:程式語言與遊戲比較遊戲
- 更小、更快、更簡單Google ProtoBuf 跨語言通訊協議Go協議
- 一個程式語言比較網站網站
- Lora通訊解決方案對比
- golang(gin框架),基於RESTFUL的跨語言遠端通訊嘗試Golang框架REST
- C語言的比較庫函式--qsortC語言函式
- 11大類程式語言功能比較表
- 比較服務間通訊的技術 - ardalis
- C語言實現TCP通訊C語言TCP
- Go語言實現TCP通訊GoTCP
- ABAP, Java和JavaScript三種語言的比較JavaScript
- python開發-與其他語言的比較Python
- Ruby程式語言與Ruby之間的比較
- 【React】元件通訊 - 跨層通訊React元件
- Unix系統下程式間通訊方式及比較
- 現代語言Go、Rust、Swift和Dart的比較GoRustSwiftDart
- Startalk(星語)——通用通訊解決方案
- 跨源通訊、跨域訪問跨域
- Python、 JAVA這種語言比較火,是不是C語言就不行了PythonJavaC語言
- 從OOP和FP看蘋果Swift語言與Scala比較OOP蘋果Swift
- 從各方面比較現在多種語言 (轉)
- 通訊錄的c語言程式編輯C語言
- golang語言非同步通訊之WaitGroupGolang非同步AI
- Android跨程式通訊Android
- 嵌入式系統使用壽命程式語言比較好
- 為什麼動態型別語言相對比較慢?型別
- 多語言永續性與資料儲存比較綜述
- 不同解決方案的比較
- 瀏覽器與go語言的websocket通訊瀏覽器GoWeb
- MQ 訊息佇列 比較MQ佇列
- 學哪種程式設計比較好,看看這六種語言!程式設計
- 這些程式語言薪資比較高 位居排行榜之首
- 這麼多程式語言,初學者選擇哪個比較好?
- 與其他語言的比較——瞭解ASP、PHP和JSP (轉)PHPJS