试图了解如何在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中看到的是两个连接,但只有一个连接:
当然,如果我在第二个频道中指定另一个主机/端口,或者只运行我的应用程序的两个实例,我会看到两个TCP连接。
从这个行为来看,我猜在C#实现中有一些具有相同主机/端口的通道管理。但我很好奇这是一种在一个实例中创建不同渠道的方法吗?
答案 0 :(得分:1)
我对gRPC C#并不是很熟悉,但gRPC C#使用gRPC核心,gRPC核心具有通道和子通道的概念。
子信道对应于实际的TCP连接,并且信道使用一个或多个子信道进行呼叫。如果这些信道解析到同一对等体,则子信道可以被一个或多个信道(重新)使用。
因此,当您为同一主机和端口创建两个通道时,可能会重用基础子通道,因此只能看到一个连接。
答案 1 :(得分:0)
要强制不重用子通道,请传递以下通道选项: new ChannelOption(“ sub-channel-separator”,Guid.NewGuid()。ToString())