nodejs + grpc-node服务器比REST慢得多 使用grpc-node的服务B 使用Go gRPC的服务B 服务B与REST一起使用Koa 网络IO

如何解决nodejs + grpc-node服务器比REST慢得多 使用grpc-node的服务B 使用Go gRPC的服务B 服务B与REST一起使用Koa 网络IO

我已经实现了2个服务A和B,其中A可以通过gRPC(使用带有Mali的grpc-node)和纯HTTP REST调用与B通讯。

请求大小可以忽略不计。

响应大小为1000个,如下所示:

{
   "productId": "product-0","description": "some-text","price": {
      "currency": "GBP","value": "12.99"
   },"createdAt": "2020-07-12T18:03:46.443Z"
}

A和B都作为服务部署在GKE中,并且它们使用kube-proxy通过内部网络进行通信。

我发现REST版本比gRPC快很多。 REST调用的p99位于

详细信息

节点版本和操作系统:node:14.7.0-alpine3.12

依赖项:

    "google-protobuf": "^3.12.4","grpc": "^1.24.3","mali": "^0.21.0",

我什至通过设置gRPC选项grpc.use_local_subchannel_pool=1来创建客户端TCP池,但这似乎无济于事。

问题似乎出在服务器端,正如我从日志中看到的那样,grpc lib的call.startBatch调用花费了几秒钟来发送大小约为51kb的数据。这比REST版本要慢。

我还检查了服务的CPU和网络是否正常。 REST版本可以发送> 2mbps,而gRPC版本只能管理约150kbps。

在服务B(在gRPC中)上运行netstat会显示许多已建立的TCP连接(由于TCP池,这是预期的)。

我怀疑grpc核心C ++代码在某种程度上不如REST最佳,但我没有证据。

我接下来要看的任何想法?谢谢您的帮助

更新1

以下是一些基准:

设置

Blazemeter --REST--> services A --gRPC/REST--> service B

  • 请求正文(两个滞后)可以忽略不计
  • service A是节点服务+ Koa
  • service B有3个选项:
    • grpc-node:具有grpc-node的节点
    • gRPC + Go:执行同一gRPC服务
    • REST + Koa:带有Koa的节点
  • Blazemeter --> service A:响应有效载荷可以忽略不计,所有测试都相同
  • serivce A --> service B:gRPC / REST响应有效载荷是ProductPrice中的1000:
message ProductPrice {
  string product_id = 1; // Hard coded to "product-x",x in [0 ... 999]
  string description = 2; // Hard coded to random string,length = 10
  Money price = 3;
  google.protobuf.Timestamp created_at = 4; // Hard coded
}

message Money {
  Currency currency = 1; // Hard coded to GBP
  string value = 2;  // Hard coded to "12.99"
}

enum Currency {
  CURRENCY_UNKNOWN = 0;
  GBP = 1;
}

服务已部署到GCP中的Kubernetes,

  • 实例类型:n1-highcpu-4
  • 每个服务5个豆荚
  • 2个CPU,每个吊舱1 GB内存
  • 使用群集IP的kube-proxy(不通过Internet)(我也用clusterIP: None进行了无头测试,得出了相似的结果)

加载

50rps

结果

使用grpc-node的服务B

enter image description here

使用Go gRPC的服务B

enter image description here

服务B与REST一起使用Koa

enter image description here

网络IO

enter image description here

观察

  • gRPC + GoREST大致相当(我认为gRPC会更快)
  • grpc-nodeREST慢4倍
  • 网络不是瓶颈

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com(将#修改为@)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?