没有gRPC可以使用protocol buffer吗?

Jay*_*ayD 5 protocol-buffers grpc grpc-python

大家好,我正在接触 gRPC 和协议缓冲区,并且发现了一篇文章,其中提到消息的二进制 protobuf 文件比 Json 对应文件小 5 倍,但在那篇文章中提到这种级别的压缩可以只有通过 gRPC 传输才能实现。这个特定的评论“通过 gRPC 传输时可能进行压缩”,我似乎无法理解,因为我理解协议缓冲区是一种序列化格式,可以与 gRPC 无关地工作,或者这种理解是否有缺陷?这意味着什么?这是文章和屏幕截图的链接。 https://www.datascienceblog.net/post/programming/essential-protobuf-guide-python/ 在此输入图像描述

Bri*_*its 4

你是对的 -协议缓冲区“为大小高达几兆字节的类型化、结构化数据包提供序列化格式”并且有许多用途(例如将数据序列化到磁盘、网络传输、在应用程序之间传递数据等)。

您引用的文章有些误导性,它说

如果我们使用 gRPC 协议传输二进制 Protobuf,我们只能实现这种级别的压缩

当您考虑以下段落时,该陈述背后的推理会变得更加清晰:

如果 gRPC 不是一个选项,则常见模式是使用 base64 编码对二进制 Protobuf 数据进行编码。尽管这种编码不可避免地使有效负载的大小增加了 33%,但它仍然比相应的 REST 有效负载小得多。

因此,这似乎侧重于通过HTTP传输数据,HTTP是一种基于文本的协议(HTTP/2对此有所改变)。因为 Profobuf 是一种二进制格式,所以它通常在通过 HTTP 传输之前进行编码(从技术上讲,它可以使用类似的东西以二进制格式传输application/octet-stream)。该文章提到了 base64 编码,并使用它增加了它的大小。

如果您不使用 HTTP(例如写入磁盘、直接 TCP/IP 链接、Websockets、MQTT 等),则这不适用。

话虽如此,我相信这个例子可能有点夸大了 Protobuf 的好处,因为大量的 HTTP 流量被压缩了(这篇文章报告了他们的测试中有 9% 的差异)。