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

2024-05-08

目标是引入一种性能更好的传输和应用层协议latency and 网络吞吐量。目前,该应用程序使用REST with HTTP/1.1并且我们遇到了很高的延迟。我需要解决这个延迟问题并且我愿意使用gRPC(HTTP/2) or 休息/HTTP2.

HTTP/2:

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

我知道以上所有优点。问题一:如果我使用使用 HTTP/2 进行 REST,我确信,与相比,我将获得显着的性能提升使用 HTTP/1.1 进行 REST,但这与gRPC(HTTP/2)?

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

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

有这么多博客/视频互联网上将 gRPC(HTTP/2) 与(REST 和 HTTP/1.1)进行了比较this https://husobee.github.io/golang/rest/grpc/2016/05/28/golang-rest-v-grpc.html。如前所述,我想知道比较 GRPC(HTTP/2) 和(REST 与 HTTP/2)的差异和好处。


默认情况下,gRPC 并不比 HTTP/2 上的 REST 快,但它为您提供了加快速度的工具。有些事情使用 REST 很难或不可能完成。

  • 选择性消息压缩。在 gRPC 中,流式 RPC 可以决定压缩或不压缩消息。例如,如果您通过单个流传输混合文本和图像(或任何混合的可压缩内容),则可以关闭图像压缩。这可以让你免于压缩已经压缩的数据,这些数据不会变得更小,但会消耗你的CPU。
  • 一流的负载平衡。虽然不是点对点连接的改进,但 gRPC 可以智能地选择将流量发送到哪个后端。 (这是一个库功能,而不是有线协议功能)。这意味着您可以将请求发送到负载最少的后端服务器,而无需使用代理。这是延迟的胜利。
  • 大力优化。 gRPC(库)位于连续基准 https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5180705743044608以确保没有速度回归。这些基准正在不断提高。同样,这与 gRPC 协议没有任何关系,但使用 gRPC 后您的程序会更快。

正如 nfirvine 所说,您将通过使用 Protobuf 看到大部分性能提升。当你could将 proto 与 REST 结合使用,它与 gRPC 集成得非常好。从技术上讲,您可以将 JSON 与 gRPC 结合使用,但大多数人在习惯了 protos 后并不想付出性能成本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gRPC(HTTP/2) 比使用 HTTP/2 的 REST 更快吗? 的相关文章

  • 如何将带有自定义标头的任意 JSON 数据发送到 REST 服务器?

    TL DR 如何将 JSON 字符串发送到带有 auth 标头的 REST 主机 我尝试了 3 种不同的方法 发现一种适用于匿名类型 为什么我不能使用匿名类型 我需要设置一个名为 Group Name 的变量 并且连字符不是有效的 C 标识
  • 如何在 G-WAN 中添加 HTTP/2

    我想知道是否可以通过使用解决方案 nghttp2 https nghttp2 org https nghttp2 org 很抱歉这么晚才回答 出于某种原因 Stackoverflow 没有通知我们这个问题 我之所以找到它只是因为收到了更新的
  • Response.Redirect 并不总是重定向

    我们在一个工作不一致的页面上有一个简单的 Response Redirect IIS 6 0 大多数情况下 它会正确重定向 但我们收到一些用户抱怨 他们没有重定向 而是看到 302 对象移至此处 页面 该页面显示标题信息以及正确的位置 如果
  • 传递自定义类型查询参数

    如何接受自定义类型查询参数 public String detail QueryParam request final MYRequest request 上面的行在启动服务器时出现错误 jersey server model ModelV
  • testcafe是否支持rest api的测试

    当您尝试直接测试其余 api url 时 测试会在 testcafe 浏览器中挂起 我正在尝试使用请求挂钩针对我的其余 API 端点运行测试 但是当我从命令行运行测试时 浏览器会打开 API 端点并加载它并挂起 测试没有通过或失败并且挂起
  • struts2-rest 插件..使 struts 操作 + 休息操作一起工作,但是。给出 java.lang.reflect.InitationTargetException

    我正在将现有的 struts 2 应用程序转换为通过一些基于休息的服务来提供服务 我使用了两个插件 struts2 rest插件和struts convention插件 除了这些之外 我还使用了 asm jar 因为上面给出了 asm ja
  • 使用 mocha/chai 确保 REST API 提供文件?

    我想验证对 REST API 端点之一的调用是否正在提供文件 但我不确定如何进行操作 并且我没有看到任何相关示例 我确实看过文档 http chaijs com api bdd 但这对我没有多大帮助 服务器端代码本质上是 在 Express
  • 泽西宁静例外

    我面对的是泽西岛 2 7 这是我的服务 package edu srv rest import javax ws rs GET import javax ws rs POST import javax ws rs Path import j
  • Google 计算负载均衡器在 DELETE 时抛出 400 Bad Request

    我通过实例模板创建了一个实例组 并将该实例组与 http 负载均衡器使用的后端服务对齐 现在 当我从我创建的实例组中打开实例虚拟机的 URL 时 我可以执行以下操作GET POST and DELETE请求和所有请求都很快 一切都按预期进行
  • App Engine Flex 服务正在运行但找不到

    如何关闭我已删除且无法访问的 App Engine Flex 服务 昨天 我部署了一项新的 App Engine Flex 服务 然后将其删除 无论出于何种原因 该服务在一天后仍在运行 我可以通过查看日志查看器来确认它仍在运行并生成日志 当
  • 开发者环境-如何调用/消费其他微服务

    背景 我的环境 Java Play2 MySql 我在 Play2 gt S1 S2 S3 上编写了 3 个无状态 Restful 微服务 S1 消耗来自 S2 和 S3 的数据 因此 当用户点击 S1 时 该服务会异步调用 S2 S3 合
  • Flask Restful API url

    我正在使用 Flask RESTful http flask restful readthedocs org en latest index html http flask restful readthedocs org en latest
  • Alamofire 仅在 GET 请求上出现请求错误

    我正在努力将我的项目从 AFNetworking 转移到 Alamofire 真的很喜欢这个项目 POST 请求工作得很好 但是 我在尝试发出 GET 请求时收到此错误 这是一些示例代码 class func listCloudCrednt
  • 当查看 X-Auth-Token 与 Authorization 标头之间的差异时,哪个是首选?

    下面两个标题有什么区别 哪一个是首选 X Auth Token dadas123sad12 Authorization Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ Authorization是客户端使用的主要标头认证如
  • 配置 Django 和 Google 云存储?

    I am not使用应用引擎 我有一个在虚拟机上运行的普通 Django 应用程序 我想使用 Google Cloud Storage 来提供静态文件 以及上传 提供媒体文件 我有一个水桶 如何将 Django 应用程序链接到我的存储桶 我
  • Node.js 上的 Connect 出现“无法 GET /”

    我正在尝试使用以下方式开始提供一些静态网页connect像这样 var connect require connect var nowjs require now var io require socket io var app conne
  • 在 PHP 中使用 file_get_contents 进行 PUT 请求的错误请求

    这个 api 调用使用 Postman REST 客户端 可以正常工作 但是当我的 GAE 应用程序中的服务器上发出请求时 我当前收到以下错误 HTTP 请求失败 在 C Projects app file php 第 26 行 打开流失败
  • Django:如何测试“HttpResponsePermanentRedirect”

    我正在为我的 django 应用程序编写一些测试 在我看来 它使用 HttpResponseRedirect 重定向到其他一些网址 那么我该如何测试呢 姜戈TestCase类有一个方法assertRedirects https docs d
  • 如何使用 python urllib 在 HTTP/1.1 中保持活力

    现在我正在这样做 Python3 urllib url someurl headers HOST somehost Connection keep alive Accept Encoding gzip deflate opener urll
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R

随机推荐

  • 字段的特定 MessageBodyWriter

    假设我在 JAX RS 1 环境 带有 Jackson 提供程序的 RestEasy 2 中有一个数据类 如下所示 class Foo int id String name Bar bar with Bar being class Bar
  • 创建响应式 SVG 剪辑路径 / 使 SVG 响应式

    我正在尝试使用创建响应式 SVG 剪辑路径
  • HTML5 -

    Reading 一篇文章 http html5doctor com the article element on the
  • 如何在expressjs中调用另一个api?

    我有一个这样的API app get test req res gt console log this is test 和另一个API app get check req res gt I want to call test api wit
  • 如何显示图像的其他图像是无

    经过我认真思考后 我只是不知道我的代码有什么问题以及如何修改它 问题是这样的 当用户插入 url 时 如果该 url 是指向 youtube 的链接 则需要显示 youtube 缩略图 如果该网址不是 YouTube 视频的链接 则需要显示
  • 加载列表之前确定ListView的高度

    是否可以在将 ListView 呈现在屏幕上之前确定其高度 如果我的 ListView 有 3 个项目 并且高度仅限于这 3 个项目 并且 ListView 不占据整个屏幕的高度 我可以在 Android 在屏幕上显示项目之前确定高度吗 使
  • 我是否需要注册 APN 才能在 iOS 中使用 GCM 推送通知?

    我正在用 cordova 构建一个混合应用程序 我正在使用phonegap plugin push 注册到GCM 这样我就可以将通知推送到Android 我的问题是我是否需要 APNs 证书才能在 iOS 中使用 GCM 或者仅使用插件并注
  • 为什么Intellij IDEA在nodejs中显示require undefined?

    有谁知道为什么intellij IDEA强调需要 我怎样才能解决这个问题 我在 Windows 上使用 IntelliJ IDEA 15 0 3 也遇到了同样的问题 解决方案是 文件 gt 设置 gt 语言和框架 gt Nodejs 和 N
  • DocumentClientException“请求大小太大”

    我创建了 JSON byte length 太大 当我尝试使用 api java 时 documentClient createDocument getTodoCollection getSelfLink document null fal
  • Firebase Crashlytics 与 UncaughtExceptionHandler

    我集成了 Firebase Crashlytics 版本 2 9 1 来挖掘崩溃 以覆盖我的应用程序的性能和稳定性 如果应用程序有自己的 UncaughtExceptionHandler 则不会在 firebase crashlytics
  • 我们可以使用 python 变量来保存整个文件吗?

    假设我们知道所有文件都将被加载到内存中并且我们负担得起 在 python 变量中加载整个文件 可能是二进制文件 有哪些缺点 如果有 或限制 如果有 如果这在技术上是可行的 是否应该避免这种情况 为什么 关于文件大小问题 该解决方案的最大大小
  • 智能卡 CMS 解密

    我在用着充气城堡管理我的项目的加密功能 我设法使用CMS用于加密和解密 两个密钥都存储在我的文件系统中 a cert and a p12 这是我实际使用的两个函数 private static byte CmsEncrypt byte me
  • 有没有任何代码分析工具可以让我的工作变得更轻松? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我最近从一个刚刚退休的人那里继承了一个用托管 C 编写的程序 在花了一些时间挖掘之后 我可以诚实地说 至
  • Chrome 自定义选项卡的自定义关闭按钮

    是否可以覆盖 Android 中自定义 chrome 选项卡上默认关闭按钮的行为 例如 我们可以重定向到新的 Activity 或启动对话框 而不是仅仅关闭 chrome 选项卡吗 我不确定你是否能做到这一点 您可以尝试启动 CustomT
  • 在 Sinatra 中缓存响应的最佳方式?

    我正在使用我用 Sinatra 制作的 API 构建一个简单的应用程序 该 API 返回一些 JSON 这是相当多的 JSON 我的应用程序的 API 依赖于对其他 API 的数百个请求 我大概可以将结果缓存 5 天左右 数据完全没有问题
  • 如何正确阻止异步代码?

    我有大量以以下方式编写的代码 public string SomeSyncOperation int someArg sync code SomeAsyncOperation someArg someOtherArg ConfigureAw
  • 机架 1.3.2 的问题。您已经激活了机架 1.3.2,但您的 Gemfile 需要机架 1.2.3

    我在 Debian 上有 Passenger 3 0 9 带有 Gem Rack 1 3 2 和 1 2 1 使用带有乘客 e 捆绑器的 Rails 3 0 应用程序 我遇到以下错误 您已经激活了机架 1 3 2 但您的 Gemfile 需
  • 如何使用 Parse 和 Swift 从 Facebook 注销或撤销登录

    我正在尝试将我的用户完全从我的应用程序中注销 使用时 PFUser logout 我成功地将用户从 Parse 中注销 但是 当我返回应用程序并单击登录按钮时 我被重定向到 Facebook 屏幕 显示 您已经授权 应用程序名称 所以我永远
  • Non-Authoritative-Reason 标头字段 [HTTP]

    当我有响应标头时 我很难找出它的含义Non Authoritative Reason HSTS 我搜索了很多 但只是想出了一些关于 HSTS 从 HTTP 重定向到 HTTPS 的解释 有人能帮我吗 顺便说一句 我正在使用 Chrome T
  • gRPC(HTTP/2) 比使用 HTTP/2 的 REST 更快吗?

    目标是引入一种性能更好的传输和应用层协议latency and 网络吞吐量 目前 该应用程序使用REST with HTTP 1 1并且我们遇到了很高的延迟 我需要解决这个延迟问题并且我愿意使用gRPC HTTP 2 or 休息 HTTP2