首页 > 解决方案 > 如何处理grpc客户端连接错误?

问题描述

请帮助我了解 grpc 客户端连接错误处理。

我以前使用过 Micrsoft WCF。如果没有服务接受传入连接,则尝试连接几次并放弃很容易,如下所示:

// this is pseudo code
int attemptCount = 0;
while (true)
    try
    {
        client.Connect(); // exception is raised if there is not service listening for incoming connection 
        break;
    }
    catch (Exception)
    {
        client.Abort(); // to clear connection faulted state
        if (++attempCount == 5)
            throw;
        Thread.Wait(500); // waiting for service to start
    }

如果在某个 IP:port 上没有服务侦听,则进行 5 次连接尝试,然后终止客户端应用程序

这在我同时从 VisualStudio 调试启动客户端和服务时使用,因此有时客户端首先启动并且它必须等待服务启动。

我尝试使用 gRPC 客户端执行相同的操作,但没有方法可以channel.StateChannelState.TransientFailure恢复工作重置。我知道如果出现问题,gRPC 会在连接之间暂停:

对于许多非致命故障(例如,由于服务器尚不可用,TCP 连接尝试超时),通道可能会在此状态下花费越来越多的时间。 https://grpc.io/grpc-java/javadoc/io/grpc/ConnectivityState.html

我可以尝试使用WaitForStateChangedAsync,但如何配置 gRPC 客户端以在重新连接尝试之间等待一定的时间?

有没有其他方法可以连接多次并终止 gRPC 的客户端?

谢谢

标签: c#grpc

解决方案


gRPC 在内部对通道重新连接具有指数退避控制。

我们确实有一些退避参数,其中一些可以通过通道参数进行配置。 https://github.com/grpc/grpc/blob/2bd7ad0112f56d2bdbc37d01a431c1e375039f2e/src/core/ext/filters/client_channel/subchannel.cc#L61

但据我所知,我们没有任何参数来控制最大尝试时间。请在https://github.com/grpc/grpc上提交功能请求,以便我们跟进。


推荐阅读