Node JS:双向 GRPC 调用会打开多个 http2 连接吗?
Node JS: Will a Bidirection GRPC Call Open Multiple http2 Connections?
双向 RPC 调用是否会打开多个 http2 连接?
我正在编写一个 GRPC 客户端,该客户端正在与我没有 own/control 的 GRPC 服务器通信。我正在使用 @grpc/grpc-js 包。有人问我这个库是否会打开到 grpc 端点的多个 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
对象 that initiate the http2 connections,所以它似乎是每个子频道一个 http2 连接。但是,调用、http2call 流、主通道、子通道、负载均衡器和过滤器堆栈之间的关系对我来说还不清楚,我无法推断何时(如果有的话)第二个 HTTP2 连接将被打开。
理想情况下,如果有人能回答问题双向 RPC 调用是否会打开多个 http2 连接?,那就太好了。如果这个答案太复杂,我会选择一个关于这些不同对象之间的关系的操作理论,这样我就可以自己推理这个问题,或者其他任何你认为有帮助的事情。
无论请求是什么流类型,gRPC 都会使用每个单个连接 来打开多个流。这是 HTTP/2 被选为 gRPC 底层协议的一个主要原因:将流多路复用到连接上已经是该协议的一部分。
在您提到的 类 中,Channel
是对连接的 API 级抽象。 Channel 表示任意数量的到目标字符串引用的后端的连接。它将根据需要自动建立连接以处理发起的任何请求。
你没有提到的Resolver
决定了哪些后端地址与目标字符串相关联。例如,DnsResolver
将查找 DNS 记录。
A LoadBalancer
确定要建立哪些特定连接以及如何在这些连接之间分配请求。默认的负载平衡策略 "pick first" 只是将所有请求发送到首先成功建立的连接。还有 "round robin" 负载平衡策略,它会尝试与多个后端建立连接,然后在开始调用时循环通过它们。
一个 Subchannel
表示到单个后端的连接,如果它掉线可以重新建立。
过滤器堆栈对请求在顶级 API 和在网络上发送之间应用一些转换。
双向 RPC 调用是否会打开多个 http2 连接?
我正在编写一个 GRPC 客户端,该客户端正在与我没有 own/control 的 GRPC 服务器通信。我正在使用 @grpc/grpc-js 包。有人问我这个库是否会打开到 grpc 端点的多个 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
对象 that initiate the http2 connections,所以它似乎是每个子频道一个 http2 连接。但是,调用、http2call 流、主通道、子通道、负载均衡器和过滤器堆栈之间的关系对我来说还不清楚,我无法推断何时(如果有的话)第二个 HTTP2 连接将被打开。
理想情况下,如果有人能回答问题双向 RPC 调用是否会打开多个 http2 连接?,那就太好了。如果这个答案太复杂,我会选择一个关于这些不同对象之间的关系的操作理论,这样我就可以自己推理这个问题,或者其他任何你认为有帮助的事情。
无论请求是什么流类型,gRPC 都会使用每个单个连接 来打开多个流。这是 HTTP/2 被选为 gRPC 底层协议的一个主要原因:将流多路复用到连接上已经是该协议的一部分。
在您提到的 类 中,Channel
是对连接的 API 级抽象。 Channel 表示任意数量的到目标字符串引用的后端的连接。它将根据需要自动建立连接以处理发起的任何请求。
你没有提到的Resolver
决定了哪些后端地址与目标字符串相关联。例如,DnsResolver
将查找 DNS 记录。
A LoadBalancer
确定要建立哪些特定连接以及如何在这些连接之间分配请求。默认的负载平衡策略 "pick first" 只是将所有请求发送到首先成功建立的连接。还有 "round robin" 负载平衡策略,它会尝试与多个后端建立连接,然后在开始调用时循环通过它们。
一个 Subchannel
表示到单个后端的连接,如果它掉线可以重新建立。
过滤器堆栈对请求在顶级 API 和在网络上发送之间应用一些转换。