2015-12-19 63 views
5

我最近讀到protocol buffers的文章,協議緩衝區,在哪裏使用它們?

Protocol Buffers的序列化是結構化數據的方法。這是 有用的程序開發互相溝通通過 線或用於存儲數據。該方法涉及的接口描述 語言描述了一些數據的結構和 從該說明書生成源代碼,用於生成或解析 字節流,它表示的結構化數據

我想如何處理該程序知道的是,在哪裏使用它們?有沒有真實的例子,而不是簡單的地址簿例子?它是否用於預先緩存來自數據庫的查詢結果?

+0

[官方文檔](https://developers.google.com/protocol-buffers/)可能比其他人的Python分支更好。 – dimo414

+1

Cherenkov望遠鏡陣列最有可能使用ProtoBufs而不是ZMQ來發送望遠鏡數據:http://arxiv.org/pdf/1508.06473v1.pdf – MaxNoe

+0

OpenStreetMap從XML切換到協議緩衝區以減小文件大小並提高解析速度: http://wiki.openstreetmap.org/wiki/PBF_Format – jpa

回答

2

協議緩衝區是一種數據存儲和交換格式,特別用於RPC - 程序或計算機之間的通信。替代方案包括特定於語言的序列化(Java序列化,Python pickles等),CSV和TSV等表格格式,XML和JSON等結構化文本格式以及其他二進制格式,如Apache Thrift。從概念上講,這些都是表示結構化數據的不同方式,但實際上它們有不同的優點和缺點。

協議的緩衝劑是:

  • 空間高效,依靠custom format緊湊地表示數據。
  • 提供強類型安全的跨語言(特別是在像Java這樣的強類型語言中,但即使在Python中它仍然非常有用)。
  • 設計爲反向和前向兼容。對協議緩衝區進行結構更改(通常添加新的字段或廢棄舊的字段)很容易,而無需確保使用proto的所有應用程序都同時更新。
  • 手動操作有點繁瑣。雖然有文本格式,但它主要用於手動檢查,而不是存儲原型。例如,JSON對於人類來說編寫和編輯要容易得多。因此protos通常由程序編寫和讀取。
  • 取決於編譯器.proto。通過將結構從數據協議中分離出來,緩衝區可以是精簡而意味着的,但是這意味着沒有關聯的文件和像protoc這樣的工具來生成解析它的代碼,原型格式的任意數據是不可用的。這使protos成爲發送數據給可能沒有.proto文件的其他人的糟糕選擇。

做出一些一概而論約不同的格式:

  • CSV/TSV /等。對於從不需要在人員或程序之間傳輸的人工構造數據非常有用。構建起來非常簡單,而且易於解析,但它是一個噩夢,可以保持同步,並且無法輕鬆表示複雜的結構。
  • 像泡菜特定語言的序列化可以是短暫的序列化是有用的,但很快跑入向後兼容性問題,顯然限制了你一種語言。除了在一些非常特殊的情況下,protobufs以更安全和更好的面向未來的方式實現所有相同的目標。
  • JSON非常適合在不同方(例如公共API)之間發送數據。由於結構和內容一起傳輸,任何人都可以理解它,並且很容易在所有主要語言中解析。現在使用XML等其他結構化格式的理由不大。
  • 協議緩衝區等二進制格式幾乎適用於所有其他數據序列化用例;長期和短期存儲,進程間通信,進程內和應用程序範圍的緩存等等。

谷歌着名uses protocol buffers for practically everything they do。如果你可以想象一個需要存儲或傳輸數據的理由,Google可能會用協議緩衝區來做。

2

我用它們來創建一個金融交易系統。原因如下:

  • 有許多語言的圖書館。有些東西需要在C++中,其他人在c#中。它可以擴展到Python或Java等。
  • 它需要快速序列化/反序列化和壓縮。這是由於金融交易系統的速度要求。這些消息比可比的文本類型消息短得多,這意味着您從未遇到過將它們放在一個網絡數據包中的問題。
  • 它不需要在電線上可讀。以前系統具有很好的調試XML,但您可以通過其他方式獲得調試輸出,並在生產中關閉它們。
  • 它爲您的消息提供了一個自然的結構,以及一個用於獲取所需零件的API。編寫一些自定義的代碼需要考慮所有的輔助函數,從二進制文件中提取數字,以及角落案例等等。