首页 > 解决方案 > 长连接上的 Grpc 错误:Ping 太多

问题描述

我正在构建一个具有微服务架构的系统,该架构使用 grpc 在服务之间进行通信。一开始我有一个长时间运行的请求,它到达一个中心端点,该端点向其他服务发出一堆请求。对中央服务的第一个请求依次等待,直到其他服务完成计算它们的请求,然后才收到来自中央端点的响应。这可能需要几分钟才能完成。问题是我不断收到一个 grpc 错误,说“ping 太多”。我通过以下方式在我的 go 服务器上设置了 keepalive 参数:

ka_params := keepalive.ServerParameters{
        Time: 10 * time.Second,
        Timeout: 5 * time.Second,}

opts := []grpc.ServerOption{
    grpc.KeepaliveParams(ka_params),
}

s = grpc.NewServer(opts...)

在我的python服务器中是这样的:

opts = [("grpc.keepalive_time_ms", 10000), 
        ("grpc.keepalive_timeout_ms", 5000), 
        ("grpc.keepalive_permit_without_calls", True),
        ("grpc.http2.max_pings_without_data", 0)]
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), options=opts)

我不确定为什么我会收到太多 ping 的错误。由于keepalive,难道不是预期的ping吗?

标签: grpcgrpc-pythongrpc-go

解决方案


我想我找到了解决方案。问题的症结在于 python 和 golang grpc 版本具有不同的默认设置,并且 python grpc 的文档记录非常差。

要解决此问题,您必须将 python 服务器上的 max_ping_strikes 设置为 0。python 服务器应具有以下选项:

opts = [("grpc.keepalive_time_ms", 10000), 
        ("grpc.keepalive_timeout_ms", 5000), 
        ("grpc.keepalive_permit_without_calls", True),
        ("grpc.http2.max_ping_strikes", 0)] 

推荐阅读