grpc - 长连接上的 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吗?
解决方案
我想我找到了解决方案。问题的症结在于 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)]
推荐阅读
- javascript - 反应钩子 | useEffect :为什么这两个钩子都有一个依赖 lint 错误,但不是两个?
- c# - 显示数量来自数据库且价格由用户输入的每一行的总价
- c++ - C++ 长整数显示
- html - 即使加载了所有内容,Angular 应用程序也会在 iframe 中显示白页
- r - 将前导零添加到特定行
- python - 列表在被要求这样做之前附加字典
- swiftui - SwiftUI 中 tabItem 的“标签”是什么?
- output - Maxima 将当前循环迭代添加到文件名
- janusgraph - Janusgraph 幽灵顶点
- r - R:“mxnet”的命名空间加载失败:包“mxnet”是在 R 4.0.0 之前安装的:请重新安装它