服务空闲五六分钟后第一批请求必报 rpc error: code = Unavailable desc = connection error,重试一次就恢复正常,白天从来没出现过,只有夜里低峰才复现。日志里能对上时间点,这种反而好排。
中间网关或者 NAT 对空闲 TCP 连接有回收超时,gRPC 长连接又没开 keepalive,连接被悄悄关掉,客户端还以为是好的,下次用就撞上断连,只能重连。这一点先确认清楚,后面就不用反复试。
grpc.keepalive_time_ms=60000 grpc.keepalive_timeout_ms=10000 grpc.keepalive_permit_without_calls=1
「gRPC Unavailable 空闲断连」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。
处理上按这个顺序:客户端这一侧打开 keepalive,按分钟级别定期发送心跳包保活;服务端也要允许 keepalive,别把正常心跳当成异常连接拒掉;把网关上的 idle timeout 调到比心跳间隔更长一些,留点余量。
结果对不对很好判断,空闲十分钟后再发请求,第一次就能成功,日志里不再出现 Unavailable,体验正常。
