【问题标题】:Is gRPC(HTTP/2) faster than REST with HTTP/2?gRPC(HTTP/2) 是否比使用 HTTP/2 的 REST 更快?
【发布时间】:2017-12-06 06:03:18
【问题描述】:

目标是引入一种在延迟网络吞吐量方面更好的传输和应用层协议。目前,该应用程序使用 RESTHTTP/1.1,我们会遇到高延迟。我需要解决这个延迟问题,我愿意使用 gRPC(HTTP/2)REST/HTTP2

HTTP/2:

  1. 多路复用
  2. 单 TCP 连接
  3. 二进制而不是文本
  4. 标题压缩
  5. 服务器推送

我了解上述所有优势。 问题 1:如果我使用 REST 和 HTTP/2,我相信与 REST 和 HTTP/1.1 相比,我将获得显着的性能提升,但这与 gRPC(HTTP/2) 相比如何?

我还知道 gRPC 使用 proto 缓冲区,这是用于在线传输结构化数据的最佳 二进制序列化 技术。 Proto 缓冲区还有助于开发一种与语言无关的方法。我同意这一点,我可以使用 graphQL 在 REST 中实现相同的功能。但我担心的是序列化:问题 2:HTTP/2 实现此 二进制功能 时,使用 proto 缓冲区是否会带来额外的优势在 HTTP/2 之上?

问题 3:流式传输、双向用例而言,gRPC(HTTP/2) 与(REST 和 HTTP/2)相比如何)?

互联网上有很多博客/视频将 gRPC(HTTP/2) 与(REST 和 HTTP/1.1)进行比较,例如 this。如前所述,我想知道比较 GRPC(HTTP/2) 和(REST 与 HTTP/2)的区别和好处。

【问题讨论】:

  • 你最后用了什么?有没有 HTTP2+REST 的框架?
  • @knocte 我最终使用了 gPRC。它很好地减少了延迟。关于 HTTP/2+REST,没有特定的框架,你需要在你使用的服务器中更改设置。假设您正在使用 nginx,请查看文档以查看设置 HTTP/2 的步骤。
  • 并且您必须确保 HTTP/1.1 重用连接。否则搜索“tcp 冷启动”。 gRPC 默认重用连接。

标签: rest http google-cloud-platform http2 grpc


【解决方案1】:

默认情况下,gRPC 并不比 REST over HTTP/2 快,但它为您提供了使其更快的工具。有些事情用 REST 很难或不可能做到。

  • 选择性消息压缩。在 gRPC 中,流式 RPC 可以决定压缩或不压缩消息。例如,如果您在单个流上传输混合的文本和图像(或实际上是任何混合的可压缩内容),您可以关闭图像的压缩。这样可以避免压缩已经压缩的数据,这些数据不会变得更小,但会烧毁 CPU。
  • 一流的负载平衡。虽然在点对点连接方面没有改进,但 gRPC 可以智能地选择将流量发送到哪个后端。 (这是一个库功能,而不是有线协议功能)。这意味着您可以将请求发送到负载最少的后端服务器,而无需使用代理。这是延迟方面的胜利。
  • 高度优化。 gRPC(库)位于continuous benchmarks 下,以确保没有速度回归。这些基准正在不断改进。同样,这与 gRPC 协议没有任何关系,但使用 gRPC 后您的程序会更快。

正如 nfirvine 所说,您将看到大部分性能提升仅来自使用 Protobuf。虽然您可以将 proto 与 REST 结合使用,但它与 gRPC 的集成非常好。从技术上讲,您可以将 JSON 与 gRPC 一起使用,但大多数人在习惯 protos 后不想支付性能成本。

【讨论】:

  • 感谢@Carl 的回答。您能否与我们分享一些解释上述所有内容的链接/文档以及基准链接?
  • 我更新了对仪表板链接的响应。我没有直接解释这些的文档,但我是核心贡献者。
  • 请提供负载均衡library链接
【解决方案2】:

无论如何,我都不是这方面的专家,也没有任何数据可以支持。

您所说的“二进制特性”是 HTTP/2 帧的二进制表示。内容本身(JSON 有效负载)仍将是 UTF-8。您可以压缩该 JSON 并设置 Content-Encoding: gzip,就像 HTTP/1 一样。

但是 gRPC 也可以进行 gzip 压缩。所以说真的,我们正在讨论 gzip 压缩的 JSON 与 gzip 压缩的 protobuf 之间的区别。

您可以想象,压缩的 protobuf 应该在各个方面都优于压缩的 JSON,否则 protobuf 将无法实现其目标。

除了 JSON 与 protobufs 的普遍性之外,我认为使用 protobufs 的唯一缺点是您需要 .proto 来解码它们,比如在 tcpdump 情况下。

【讨论】:

  • 感谢@nfirvine 对这个问题的看法。序列化功能有点意思。您能否添加更多关于 REST 和 gRPC 中的序列化如何发生的详细信息/解释。太好了,如果你能分享一些相同的链接。
猜你喜欢
  • 1970-01-01
  • 2019-03-01
  • 2023-03-25
  • 2015-04-27
  • 1970-01-01
  • 2016-02-23
  • 2022-01-26
  • 1970-01-01
  • 2015-10-19
相关资源
最近更新 更多