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

Protocol buffers, where to use them?

我最近读了一篇关于 protocol buffers

的文章

Protocol Buffers is a method of serializing structured data. It is useful in developing programs to communicate with each other over a wire or for storing data. The method involves an interface description language that describes the structure of some data and a program that generates source code from that description for generating or parsing a stream of bytes that represents the structured data

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

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

替代方案包括特定于语言的序列化(Java 序列化,Python pickles, etc.), tabular formats like CSV and TSV, structured text formats like XML and JSON, and other binary formats like Apache Thrift。从概念上讲,这些只是表示结构化数据的不同方式,但在实践中它们各有优缺点缺点

协议缓冲区是:

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

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

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

Google 著名 uses protocol buffers for practically everything they do。如果您能想象出需要存储或传输数据的原因,Google 可能会使用协议缓冲区。

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

  • 有多种语言的库。有些东西需要在 C++ 中,有些则需要在 C# 中。并且可以扩展到 Python 或 Java 等
  • 它需要快速 serialize/deserialize 并且紧凑。这是由于金融交易系统对速度的要求。这些消息比类似的文本类型消息短得多,这意味着将它们放入一个网络数据包中从来没有问题。
  • 它不需要离线可读。以前系统有 XML 这对调试很好,但你可以通过其他方式获得调试输出并在生产中关闭它们。
  • 它使您的信息结构自然,API 可获取您需要的部分。编写一些自定义的东西需要考虑所有的辅助函数来从二进制文件中提取数字,以及极端情况等等。