协议缓冲区,在哪里使用它们?

时间:2015-12-19 06:26:58

标签: python protocol-buffers

我最近阅读了一篇关于protocol buffers

的文章
  

Protocol Buffers是一种序列化结构化数据的方法。它是   有用的是开发程序,通过a   电线或用于存储数据。该方法涉及接口描述   描述某些数据结构的语言和程序   从该描述生成源代码以生成或解析   表示结构化数据的字节流

我想知道的是,在哪里使用它们?有没有现实生活中的例子而不是简单的地址簿示例?例如,它是否用于预缓存数据库中的查询结果?

2 个答案:

答案 0 :(得分:2)

协议缓冲区是一种数据存储和交换格式,特别适用于RPC - 程序或计算机之间的通信。

替代方案包括特定于语言的序列化(Java序列化,Python pickles等),CSV和TSV等表格格式,XML和JSON等结构化文本格式以及Apache Thrift等其他二进制格式。从概念上讲,这些只是表示结构化数据的不同方式,但在实践中它们有不同的优缺点。

协议缓冲区是:

  • 节省空间,依靠custom format紧凑地表示数据。
  • 提供强大的类型安全跨语言(特别是在Java等强类型语言中,但即使在Python中它仍然非常有用)。
  • 旨在向前和向后兼容。很容易对协议缓冲区进行结构更改(通常添加新字段或弃用旧字段),而无需确保所有使用proto的应用程序同时更新。
  • 手动操作有点乏味。虽然有文本格式,但它主要用于手动检查而不是存储protos。例如,JSON对于人类来说更容易编写和编辑。因此,protos通常由程序编写和读取。
  • 取决于.proto编译器。通过将结构与数据协议分离,缓冲区可以是精简的,但它意味着没有关联的.proto文件和像protoc这样的工具来生成解析它的代码,原始格式的任意数据都无法使用。这使得protos成为向其他可能没有.proto文件的人发送数据的不良选择。

对不同格式进行一些全面的概括:

  • CSV / TSV /等。对人类构建的数据非常有用,这些数据永远不需要在人或程序之间传输。它易于构造且易于解析,但却是一个保持同步的噩梦,不能轻易代表复杂的结构。
  • 像pickle这样的特定于语言的序列化对于短期序列化很有用,但很快会遇到向后兼容性问题,显然会限制你使用一种语言。除了在一些非常特殊的情况下,protobufs实现了所有相同的目标,更安全,更好的面向未来。
  • JSON非常适合在不同方之间(例如公共API)发送数据。由于结构和内容一起传输,任何人都可以理解它,并且很容易用所有主要语言进行解析。现在没有理由使用其他结构化格式,如XML。
  • 协议缓冲区等二进制格式是几乎所有其他数据序列化用例的理想选择;长期和短期存储,进程间通信,进程内和应用程序范围的缓存等等。

谷歌着名uses protocol buffers for practically everything they do。如果你能想象出需要存储或传输数据的理由,Google可能会使用协议缓冲区。

答案 1 :(得分:2)

我用它们来创建一个金融交易系统。原因如下:

  • 有许多语言的图书馆。有些东西需要在c ++中,其他东西在c#中。它可以扩展到Python或Java等。
  • 需要快速序列化/反序列化和压缩。这是由于金融交易系统的速度要求。这些消息比同类文本类型的消息要短得多,这意味着你在一个网络数据包中装入它们时从未遇到过问题。
  • 它不需要通过线路可读。以前系统的XML很适合调试,但你可以通过其他方式获得调试输出,并在生产中关闭它们。
  • 它为您的消息提供了一个自然的结构,以及一个用于获取所需部件的API。写一些自定义的东西需要考虑所有的辅助函数来从二进制文件中提取数字,包括极端情况和所有这些。