gRPC C#客户端通道管理

时间:2018-02-16 07:38:02

标签: c# grpc

试图了解如何在C#中管理gRPC频道。

从频道摘要

中说明
  

与调用远程调用相比,创建频道是一项昂贵的操作,因此通常应该尽可能多地重复使用单个频道。

所以我把它视为我创建两个Channel I实例获得两个TCP连接。

简单代码

var channel1 = new Channel(host, port, ChannelCredentials.Insecure);
var channel1 = new Channel(host, port, ChannelCredentials.Insecure);

channel1.ConnectAsync().Wait();
channel2.ConnectAsync().Wait();

我期望在CurrPorts中看到的是两个连接,但只有一个连接:

enter image description here

当然,如果我在第二个频道中指定另一个主机/端口,或者只运行我的应用程序的两个实例,我会看到两个TCP连接。

从这个行为来看,我猜在C#实现中有一些具有相同主机/端口的通道管理。但我很好奇这是一种在一个实例中创建不同渠道的方法吗?

2 个答案:

答案 0 :(得分:1)

我对gRPC C#并不是很熟悉,但gRPC C#使用gRPC核心,gRPC核心具有通道和子通道的概念。

子信道对应于实际的TCP连接,并且信道使用一个或多个子信道进行呼叫。如果这些信道解析到同一对等体,则子信道可以被一个或多个信道(重新)使用。

因此,当您为同一主机和端口创建两个通道时,可能会重用基础子通道,因此只能看到一个连接。

答案 1 :(得分:0)

要强制不重用子通道,请传递以下通道选项:  new ChannelOption(“ sub-channel-separator”,Guid.NewGuid()。ToString())

相关问题