当前位置: 首页 > 知识库问答 >
问题:

如何处理grpc客户端连接错误?

贾骏喆
2023-03-14

请帮助我理解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客户端执行相同的操作,但没有重置通道的方法。状态fromChannelState。暂时性故障恢复工作。我知道,如果出现问题,gRPC会在连接之间暂停:

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

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

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

非常感谢。

共有1个答案

阮梓
2023-03-14

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

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

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

 类似资料:
  • 我正在尝试在GKE上部署gRPC,我遵循了本教程-https://cloud.google.com/solutions/exposing-grpc-services-on-gke-using-envoy-proxy 我完成了所有工作,但我似乎无法在golang上运行gRPC,而我可以在grpcurl上运行它。 有人有什么想法吗?

  • 我们正在运行“helloworld”示例https://grpc.io/docs/quickstart/cpp.html#update-a-grpc-service,我们收到以下错误: 14:连接失败 迎宾员收到:RPC失败。 服务器和客户端正在监听:。服务器正在运行。首先,我们在服务器上只收到一个数据包,客户端崩溃,我用tcpdump检查了它。我们在不同的主机和同一台主机上进行了检查,但这两种情

  • 我们的用例是提出大量请求。每个请求返回1MB的数据。现在,在客户端,我们创建一个GRPC通道,并在循环中运行以下函数 我的问题是在python中如何创建grpc客户端连接池以获得更好的吞吐量? 在golang我看到了这个https://godoc.org/google.golang.org/api/option#WithGRPCConnectionPool但是我很难在python中找到文档。 py

  • 将grpc定义的服务视为: 并利用客户端连接到此服务类似于: 如果我们要在一个单独的线程中生成调用,那么处理终止一个永远运行、我们不想再使用的grpc连接的正确方法是什么?是否有任何连接或流控制方法可以调用?

  • 我目前正在考虑将gRPC用于Java应用程序(客户端)和C++服务器之间的进程间通信。RPC调用将使用非常旧的C++代码库的功能,这肯定不是线程安全的。通常,Java客户机将启动更多的gRPC服务器实例,并且仅与每个服务器实例有一个连接。是否有任何方法可以确保gRPC服务器只接受一个连接而拒绝所有其他连接尝试。否则,我需要在RPC函数中引入一些全局锁,以获得100%正确的服务器实现。

  • 我在服务器上使用GraphQL和mongoose。 当发生验证错误时,GraphQL突变发送状态代码为200的响应。在客户端,响应如下所示: 我想使用阿波罗客户端突变promise的功能访问验证错误。类似: 如何做到这一点?