2

.NET 中的 gRPC 请求依赖于必须关闭和处理的通道:

using var channel = Grpc.Net.Client.GrpcChannel.ForAddress("path to service");

//...do stuff...

await channel.ShutdownAsync();

我使用 .NET 依赖注入服务将它包装起来IServiceCollection,这应该是......

  • 每个方法 - 在每个方法调用中创建和处置通道。
  • AddTransient- 每次请求我的服务时都会创建一个新频道,但仅在需要时提供。
  • AddScoped- 每个请求都有一个新通道,但在请求完成之前保持通道打开。
  • AddSingleton- 应用程序的一个新频道。

认为 AddSingleton已经出局了,因为我不确定如何同时GrpcChannel处理大量并行请求,并且我想传递CancellationToken当前请求。

这在AddScopedvsAddTransient与 per-method 之间进行了选择。如果没有大量的测试(并且绊倒了所有的陷阱),我不确定这里的最佳实践是什么(我是 gRPC 的新手)。我应该尽快关闭频道,还是保持打开并在通话之间共享?

4

1 回答 1

3

根据微软 https://docs.microsoft.com/en-us/aspnet/core/grpc/client?view=aspnetcore-5.0#client-performance

通道代表与 gRPC 服务的长期连接。

渠道和客户的表现和使用情况:

  • 创建通道可能是一项昂贵的操作。重用 gRPC 调用的通道可提供性能优势。
  • gRPC 客户端是使用通道创建的。gRPC 客户端是轻量级对象,不需要缓存或重用。
  • 可以从一个通道创建多个 gRPC 客户端,包括不同类型的客户端。
  • 一个通道和从通道创建的客户端可以被多个线程安全地使用。
  • 从通道创建的客户端可以同时进行多个调用。需要缓存或重用。可以从一个通道创建多个 gRPC 客户端,包括不同类型的客户端。一个通道和从通道创建的客户端可以被多个线程安全地使用。从通道创建的客户端可以同时进行多个调用。

根据 grpc https://grpc.github.io/grpc/csharp-dotnet/api/Grpc.Net.Client.GrpcChannel.html

类 GrpcChannel 表示一个 gRPC 通道。通道是与远程服务器的长期连接的抽象。客户端对象可以重用相同的通道。与调用远程调用相比,创建通道是一项昂贵的操作,因此通常您应该为尽可能多的调用重用单个通道。

与往常一样,这取决于您要做什么,但可能只应由 Singleton 创建单个通道。此外,如果您确实需要处理繁重的负载,请尝试使用SocketsHttpHandler.EnableMultipleHttp2Connections ( https://docs.microsoft.com/en-us/aspnet/core/grpc/performance?view=aspnetcore-5.0#connection-concurrency )

于 2021-07-02T06:06:07.193 回答