gRPC(HTTP/2) 是否比 HTTP/2 的 REST 更快?
Is gRPC(HTTP/2) faster than REST with HTTP/2?
目标是引入一种传输和应用层协议,该协议在 延迟 和 网络吞吐量 方面更好。目前,该应用程序使用 REST 和 HTTP/1.1,我们遇到了高延迟。我需要解决这个延迟问题,我愿意使用 gRPC(HTTP/2) 或 REST/HTTP2.
HTTP/2:
- 多路复用
- 单个 TCP 连接
- 二进制而不是文本
- Header压缩
- 服务器推送
以上优点我都知道。 问题 1: 如果我将 REST 与 HTTP/2 一起使用,我相信,与REST 与 HTTP/1.1,但这与 gRPC(HTTP/2)?
相比如何
我还知道 gRPC 使用原型缓冲区,这是在线路上传输结构化数据的最佳二进制序列化技术。 Proto buffer 还有助于开发与语言无关的方法。我同意这一点,我可以使用 graphQL 在 REST 中实现相同的功能。但我担心的是序列化:问题 2: 当 HTTP/2 实现此 二进制功能时 ,使用 proto buffer 是否比 HTTP/2 更有优势?
问题三:在streaming方面,bi-directionaluse-cases,gRPC( HTTP/2) 与(REST 和 HTTP/2)比较?
互联网上有很多 blogs/videos 将 gRPC(HTTP/2) 与 (REST and HTTP/1.1) 进行比较喜欢 this。如前所述,我想知道比较 GRPC(HTTP/2) 和 (REST 与 HTTP/2) 的区别和好处。
无论如何我都不是这方面的专家,我没有任何数据来支持这一点。
你说的"binary feature"是HTTP/2帧的二进制表示。内容本身(JSON 负载)仍然是 UTF-8。您可以压缩 JSON 并设置 Content-Encoding: gzip
,就像 HTTP/1.
但是 gRPC 也进行 gzip 压缩。所以实际上,我们正在谈论 gzip 压缩 JSON 与 gzip 压缩 protobufs 之间的区别。
如您所想,压缩的 protobufs 应该在各个方面都优于压缩的 JSON,否则 protobufs 就达不到他们的目标。
除了 JSON 与 protobufs 的无处不在之外,我可以看到使用 protobufs 的唯一缺点是你需要 .proto 来解码它们,比如在 tcpdump 情况下。
gRPC 默认情况下并不比 HTTP/2 上的 REST 快,但它为您提供了使其更快的工具。有些事情用 REST 很难或不可能做到。
- 选择性消息压缩。在 gRPC 中,流式 RPC 可以决定压缩或不压缩消息。例如,如果您在单个流(或实际上任何混合的可压缩内容)上流式传输混合文本和图像,则可以关闭图像压缩。这样可以避免压缩已经压缩的数据,这些数据不会变得更小,但会消耗掉你的 CPU.
- 首先class负载均衡。虽然不是点对点连接的改进,但 gRPC 可以智能地选择将流量发送到哪个后端。 (这是库功能,而不是有线协议功能)。这意味着您可以将请求发送到负载最少的后端服务器,而无需使用代理。这是延迟胜利。
- 高度优化。 gRPC(库)在 continuous benchmarks 下,以确保没有速度倒退。这些基准不断改进。同样,这与 gRPC 协议没有任何关系,但是使用 gRPC 后您的程序会更快。
正如 nfirvine 所说,您将看到使用 Protobuf 的大部分性能提升。虽然您可以将 proto 与 REST 一起使用,但它与 gRPC 的集成非常好。从技术上讲,您可以将 JSON 与 gRPC 一起使用,但大多数人在习惯了 protos 后不想支付性能成本。
目标是引入一种传输和应用层协议,该协议在 延迟 和 网络吞吐量 方面更好。目前,该应用程序使用 REST 和 HTTP/1.1,我们遇到了高延迟。我需要解决这个延迟问题,我愿意使用 gRPC(HTTP/2) 或 REST/HTTP2.
HTTP/2:
- 多路复用
- 单个 TCP 连接
- 二进制而不是文本
- Header压缩
- 服务器推送
以上优点我都知道。 问题 1: 如果我将 REST 与 HTTP/2 一起使用,我相信,与REST 与 HTTP/1.1,但这与 gRPC(HTTP/2)?
相比如何我还知道 gRPC 使用原型缓冲区,这是在线路上传输结构化数据的最佳二进制序列化技术。 Proto buffer 还有助于开发与语言无关的方法。我同意这一点,我可以使用 graphQL 在 REST 中实现相同的功能。但我担心的是序列化:问题 2: 当 HTTP/2 实现此 二进制功能时 ,使用 proto buffer 是否比 HTTP/2 更有优势?
问题三:在streaming方面,bi-directionaluse-cases,gRPC( HTTP/2) 与(REST 和 HTTP/2)比较?
互联网上有很多 blogs/videos 将 gRPC(HTTP/2) 与 (REST and HTTP/1.1) 进行比较喜欢 this。如前所述,我想知道比较 GRPC(HTTP/2) 和 (REST 与 HTTP/2) 的区别和好处。
无论如何我都不是这方面的专家,我没有任何数据来支持这一点。
你说的"binary feature"是HTTP/2帧的二进制表示。内容本身(JSON 负载)仍然是 UTF-8。您可以压缩 JSON 并设置 Content-Encoding: gzip
,就像 HTTP/1.
但是 gRPC 也进行 gzip 压缩。所以实际上,我们正在谈论 gzip 压缩 JSON 与 gzip 压缩 protobufs 之间的区别。
如您所想,压缩的 protobufs 应该在各个方面都优于压缩的 JSON,否则 protobufs 就达不到他们的目标。
除了 JSON 与 protobufs 的无处不在之外,我可以看到使用 protobufs 的唯一缺点是你需要 .proto 来解码它们,比如在 tcpdump 情况下。
gRPC 默认情况下并不比 HTTP/2 上的 REST 快,但它为您提供了使其更快的工具。有些事情用 REST 很难或不可能做到。
- 选择性消息压缩。在 gRPC 中,流式 RPC 可以决定压缩或不压缩消息。例如,如果您在单个流(或实际上任何混合的可压缩内容)上流式传输混合文本和图像,则可以关闭图像压缩。这样可以避免压缩已经压缩的数据,这些数据不会变得更小,但会消耗掉你的 CPU.
- 首先class负载均衡。虽然不是点对点连接的改进,但 gRPC 可以智能地选择将流量发送到哪个后端。 (这是库功能,而不是有线协议功能)。这意味着您可以将请求发送到负载最少的后端服务器,而无需使用代理。这是延迟胜利。
- 高度优化。 gRPC(库)在 continuous benchmarks 下,以确保没有速度倒退。这些基准不断改进。同样,这与 gRPC 协议没有任何关系,但是使用 gRPC 后您的程序会更快。
正如 nfirvine 所说,您将看到使用 Protobuf 的大部分性能提升。虽然您可以将 proto 与 REST 一起使用,但它与 gRPC 的集成非常好。从技术上讲,您可以将 JSON 与 gRPC 一起使用,但大多数人在习惯了 protos 后不想支付性能成本。