当前位置: 首页 > 知识库问答 >
问题:

节点JS:双向GRPC调用会打开多个http p2连接吗?

谭卜鹰
2023-03-14

双向RPC调用会打开多个http2连接吗?

我正在编写一个GRPC客户端,它与我不拥有/控制的GRPC服务器对话。我正在使用@grpc/grpc-js包。有人问我这个库是否会打开到grpcendpoint的多个HTTP2连接,我对源代码不够熟悉,无法回答这个问题。我的调用和打开流的代码如下

const protoLoader = require('@grpc/proto-loader')

const packageDefinition = protoLoader.loadSync(
  __dirname + '/path/to/v1.proto',
  {keepCase: true,
    longs: String,
    enums: String,
    defaults: true,
    oneofs: true
  })

const packageDefinition = grpc.loadPackageDefinition(packageDefinition).com.foo.bar.v1
const client = new packageDefinition.IngestService(
  'server.url.here.com:443',
  grpc.credentials.createSsl()
)

const stream = client.doTheThing(metadata)        

我自己已经开始研究这个问题,我发现是SubChannel对象启动了http 2连接,所以看起来每个子信道都有一个http 2连接。然而,调用、http p2call流、主信道、子信道(s?)、负载均衡器和过滤器堆栈之间的关系对我来说还不清楚,我也不能推断何时(如果有的话)会打开第二个HTTP2连接。

理想情况下,如果有人能回答一个双向RPC调用打开多个http 2连接吗?那就太好了。如果这个答案太复杂了,我会满足于一个关于这些不同对象之间的关系的操作理论,这样我就可以自己推理,或者任何你可能认为会有帮助的东西。

共有1个答案

景鸿晖
2023-03-14

无论请求的流类型是什么,gRPC都将使用每个连接打开多个流。这是选择HTTP/2作为gRPC底层协议的一个主要原因:将流多路复用到连接上已经是该协议的一部分。

在您提到的类中,Channel是连接上的API级抽象。Channel表示目标字符串引用的到后端的任意数量的连接。它将根据需要自动建立连接以处理任何发起的请求。

您没有提到的解析器,确定与目标字符串关联的后端地址。例如,DnsResolver将查找DNS记录。

LoadBalancer确定要建立的特定连接以及如何在这些连接之间分配请求。默认的负载平衡策略“pick first”只将所有请求发送到最先成功建立的连接。还有“循环”负载平衡策略,它尝试建立到多个后端的连接,然后在启动呼叫时循环使用它们。

子通道表示与单个后端的连接,如果连接中断,可以重新建立连接。

过滤器堆栈在请求从顶级API启动到在网络上发送之间对请求应用一些转换。

 类似资料:
  • 问题内容: 我在与JoinTables进行双向一对多关联时遇到了一些问题。这就是我得到的: A类: B类: 如果创建A和B的实例,请将B的实例添加到A并保存。有用。但是,当我重新加载A的实例并尝试访问B的集合时,它将引发LazyInitializationError并显示消息“对加载集合的非法访问”。 我在哪里错了?:)谁能指出我一个使用联接表的双向关联示例。在所有权保留为A类的地方,我搜索了hi

  • EasyReact 的重点就是让节点之间的数据流动起来,所以连接节点是很重要的。 如何连接两个节点 两个节点是通过变换来连接的,在源码目录 EasyReact/Classes/Core/NodeTransforms 中我们默认实现了了很多的变换,你也可以通过继承 EZRTransform 类来实现自己的变换,一旦我们创建好一个变换后,就可以通过如下方式进行连接了: EZRMutableNode<N

  • Server.js文件: 使用者用于猫鼬模型的js: 用于在mongodb数据库中插入我的数据的Web服务: Mongo DB崩溃,最后一次输入日志文件显示2017-09-18T07:39:36.249 0000 I网络[initandlisten]连接已从127.0.0.1:57774#115(115个连接现已打开)接受。我正在使用节点mongoose及其连接方法。我不知道如何解决这个问题,如果

  • 似乎有一个类似的问题,关于的前身,我想使用。 我已经创建了一个基本的 docker-compose 堆栈,我从中运行我的 nodejs 应用程序。我想侦听调试器会话,并在本地 WebStorm 中调试我的 JavaScript 代码。 我通过以下方式进入容器 我调用我的nodejs脚本,调试器通过运行: 链接的帮助对我没有帮助,因为它假设我要使用<code>检查</code>进行本地运行: Jet

  • 在尝试使用下面提到的 createTopics 函数创建主题时,我在多节点 kafka 集群中遇到了“复制因子:1 大于可用代理:多节点集群上的 0”。我有 3 个 kafka 代理,我尝试为每个主题创建 2 个分区,并将复制因子保持在 1。不知道为什么得到这个错误。在单节点设置(1个动物园管理员和1个kafka经纪人)中,这同样可以很好地工作。 非常感谢任何帮助/ 错误: 我按照以下说明设置了一

  • 我正在使用Node开发一个应用程序。js和帆。 我将像这样运行:同时运行同一应用程序的20个实例,所有实例都将使用本地MongoDB存储模型数据。 我的问题是这样开始的:只有前7或8个启动的应用程序正在启动,其他应用程序由于无法连接到数据库而失败。 好吧,我进行了一些搜索,发现我必须增加连接数,但让我觉得有问题的是:每个启动的应用程序都在创建大约35个连接! 所以,当发布6或8个应用程序时,他们需