c# - 如何处理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.State
从ChannelState.TransientFailure
恢复工作重置。我知道如果出现问题,gRPC 会在连接之间暂停:
对于许多非致命故障(例如,由于服务器尚不可用,TCP 连接尝试超时),通道可能会在此状态下花费越来越多的时间。 https://grpc.io/grpc-java/javadoc/io/grpc/ConnectivityState.html
我可以尝试使用WaitForStateChangedAsync
,但如何配置 gRPC 客户端以在重新连接尝试之间等待一定的时间?
有没有其他方法可以连接多次并终止 gRPC 的客户端?
谢谢
解决方案
gRPC 在内部对通道重新连接具有指数退避控制。
我们确实有一些退避参数,其中一些可以通过通道参数进行配置。 https://github.com/grpc/grpc/blob/2bd7ad0112f56d2bdbc37d01a431c1e375039f2e/src/core/ext/filters/client_channel/subchannel.cc#L61
但据我所知,我们没有任何参数来控制最大尝试时间。请在https://github.com/grpc/grpc上提交功能请求,以便我们跟进。
推荐阅读
- spring-jms - 使用 @JmsListener 时的 setExceptionListener
- fluentd - 在fluentd中解析来自具有不同syslog格式的多个服务器的日志
- javascript - Javascript中类对象的二维数组
- scala - java.lang.NumberFormatException:对于输入字符串:“|”
- html - 创建导航栏时的额外空间
- javascript - 如何通过键和值以指定的方式获取对象值
- reactjs - 是否可以通过 react-router 使用 material-ui 按钮导航?
- python - Scrapy 爬取 LD JSON 数据
- node.js - 以太坊:NodeJS web3 - UnhandledPromiseRejectionWarning:资金不足
- powerbi - Power BI 中的磁贴