gRPC(HTTP/2)比使用HTTP/2的REST更快吗?

144
目标是引入一种运输和应用层协议,其延迟网络吞吐量更好。目前,该应用使用RESTHTTP/1.1,我们遇到了高延迟问题。我需要解决这个延迟问题,并且我可以使用gRPC(HTTP/2)REST/HTTP2其中任何一种。 HTTP/2:
  1. 多路复用
  2. 单个TCP连接
  3. 二进制而非文本
  4. 头部压缩
  5. 服务器推送
我了解到上述所有优势。 问题一:如果我使用 REST with HTTP/2 ,我相信,与 REST with HTTP/1.1 相比,我会获得显着的性能提升,但是与 gRPC(HTTP/2) 相比如何?
我还知道gRPC使用proto buffer,这是传输结构化数据的最佳二进制序列化技术。 Proto buffer还有助于开发语言不可知的方法。我同意这一点,我可以在REST中使用graphQL实现相同的功能。但是我的关注点在于序列化:问题二:当HTTP/2实现此二进制特性时,使用proto buffer是否在HTTP/2之上提供了额外的优势? 问题三:在流式传输,双向使用情况下,gRPC(HTTP/2)与(REST和HTTP/2)相比如何?

在互联网上有很多博客/视频将gRPC(HTTP/2)与REST和HTTP/1.1进行比较,像这篇文章。如前所述,我想了解比较GRPC(HTTP/2)和(基于HTTP/2的REST)之间的区别和优势。


{btsdaf} - knocte
2
@knocte 我最终使用了gPRC,它有效地降低了延迟。关于HTTP/2+REST,没有特定的框架,需要更改您使用的服务器中的设置。比如,如果您使用nginx,请查看文档以了解设置HTTP/2的步骤。 - Lakshman Diwaakar
请确保HTTP/1.1重用连接,否则搜索“tcp冷启动”。gRPC默认情况下会重用连接。 - bohdan_trotsenko
@LakshmanDiwaakar 你尝试过使用HTTP2 REST + PROTOBUF(或MESSAGEPACK)吗?我很想知道。个人而言,我想使用gRPC,但希望避免使用PROTOBUF,转而使用MESSAGEPACK。你是如何部署gRPC的?你是否使用了像Spring Boot、Quarkus或Micronaut这样的框架? - Debjit
我不明白为什么人们将REST与JSON联系在一起?我们也可以使用REST + PROTOBUF或REST + MESSAGEPACK。@LakshmanDiwaakar感谢您提出这个问题。 - Debjit
3个回答

148

默认情况下,gRPC并不比HTTP/2上的REST更快,但它提供了使其更快的工具。有些事情在REST中可能很难或不可能完成。

  • 选择性消息压缩。在gRPC中,流式RPC可以决定是否压缩消息。例如,如果您在单个流上流式传输混合文本和图像(或任何混合可压缩内容),则可以关闭图像的压缩。这样可以避免压缩已经压缩过的数据,这些数据不会变小,但会消耗CPU资源。
  • 一流的负载均衡。虽然不是点对点连接的改进,但gRPC可以智能地选择要发送流量的后端。这是一个库特性,而不是协议特性。这意味着您可以将请求发送到最不繁忙的后端服务器,而无需使用代理。这可以减少延迟。
  • 高度优化。gRPC(该库)正在进行持续基准测试,以确保没有速度回归。这些基准测试不断改进。同样,这与gRPC协议无关,但使用gRPC将使您的程序更快。
如nfirvine所说,您将通过使用Protobuf看到大部分性能提升。虽然您可以在REST中使用proto,但它与gRPC非常完美地集成在一起。技术上,您可以在gRPC中使用JSON,但大多数人不想在习惯了protos之后付出性能成本。

谢谢@Carl的回答。您能分享一些解释上述内容的链接/文档以及基准测试的链接吗? - Lakshman Diwaakar
5
我更新了回复并添加了链接到仪表板。虽然我没有直接解释这些内容的文档,但我是核心贡献者。 - Carl Mastrangelo
请提供负载均衡的链接。 - BozoJoe
@CarlMastrangelo 我认为这就是我在寻找的答案。此外,我想为PROTOBUF辩护,虽然我很习惯使用gRPC,但我想避免使用protobuf,而更喜欢像MESSAGEPACK这样的东西。 - Debjit

36

我并不是这方面的专家,也没有数据支撑任何观点。

你谈论的“二进制特性”是HTTP/2帧的二进制表示方式。内容本身(JSON负载)仍然是UTF-8编码的。你可以压缩这个JSON,并设置Content-Encoding: gzip,就像HTTP/1一样。

但gRPC也支持gzip压缩。因此,我们实际上在讨论gzip压缩的JSON与gzip压缩的protobuf之间的区别。

如你所想象的那样,压缩后的protobuf应该在每个方面都胜过压缩后的JSON,否则protobuf在其目标上已经失败了。

除了JSON和protobuf的普及度之外,我能看到使用protobuf的唯一缺点是需要.proto文件才能解码它们,例如在tcpdump的情况下。


2
感谢@nfirvine对问题的看法。序列化功能有点说得通。您能否在REST和gRPC中添加一些更多的细节/解释,说明序列化是如何发生的?如果您能分享一些相关链接,那就太好了。 - Lakshman Diwaakar

0
我发现, 如果你想发送txt、img或视频文件,那么REST/HTTP比gRPC更快。 如果你想通过网络发送对象,则gRPC是更有效的选择。
来源: 发送文件,, 发送大文件,, 另一篇博客

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接