IDLE、CONNECTING、READY、TRANSIENT_FAILURE、SHUTDOWN 分别什么时候出现?服务端重启后客户端多久恢复?通道状态能反映后端的健康吗?这篇用一个监视 goroutine 记录每一次状态变化,画出时间线。
调用(服务端不在)→ code=Unavailable message="connection error: desc = \"transport: Error while dialing: dial tcp 127.0.0.1:9800: connect…" 服务端重新启动的时刻:2.71s 服务端回来后的调用(fail-fast)→ 成功 状态时间线(退避设为基础 500 ms、不抖动):0.00s IDLE → 0.30s CONNECTING → 0.30s READY → 0.61s IDLE → 0.91s CONNECTING → 0.91s TRANSIENT_FAILURE → 3.49s READY
IDLE(没有连接,等调用或 Connect)、CONNECTING(建连中,包括握手)、READY(可用)、TRANSIENT_FAILURE(连接失败,退避中)、SHUTDOWN(已关闭)。
状态时间线:0.00s CONNECTING → 1.00s TRANSIENT_FAILURE 这期间发一次 fail-fast 调用(deadline 5 秒):code=Unavailable message="connection error: desc = \"error reading server preface: read tcp 127.0.0.1:50301->127.0.0.…"(0.1 ms 后返回)
已建立的连接断开后进入 IDLE,不会自己重连;下一次调用才触发重连,重连失败才进入 TRANSIENT_FAILURE。
状态时间线(4 秒内):0.00s CONNECTING → 0.00s TRANSIENT_FAILURE fail-fast 调用:code=Unavailable message="connection error: desc = \"transport: Error while dialing: dial tcp 127.0.0.1:9802: connect…"(0.1 ms 后返回) WaitForReady(true),deadline 800 ms:code=DeadlineExceeded message="latest balancer error: connection error: desc = \"transport: Error while dialing: dial tcp …"(802.1 ms 后返回)
TRANSIENT_FAILURE 期间按退避重试,服务端恢复后要等当前退避结束才会连上。fail-fast 的调用立即失败,WaitForReady 的调用等到 deadline。
Close 之后状态:SHUTDOWN;调用:code=Canceled message="grpc: the client connection is closing";WaitForReady 调用:code=Canceled message="grpc: the client connection is closing" 再 Close 一次:rpc error: code = Canceled desc = grpc: the client connection is closing
连接建立阶段最多等 MinConnectTimeout,超时就当失败。
round_robin 停掉后端 1 之后:调用 成功,通道状态 READY;再停掉后端 2:调用 code=Unavailable message="connection error: desc = \"transport: Error while dialing: dial tcp 127.0.0.1:9804: connect…",通道状态 TRANSIENT_FAILURE
状态时间线:0.00s CONNECTING → 0.00s READY → 0.50s IDLE → 0.50s CONNECTING → 0.51s TRANSIENT_FAILURE
pick_first 停掉后端 1 之后:调用 成功,通道状态 READY;再停掉后端 2:调用 code=Unavailable message="connection error: desc = \"transport: Error while dialing: dial tcp 127.0.0.1:9807: connect…",通道状态 TRANSIENT_FAILURE
状态时间线:0.00s CONNECTING → 0.00s READY → 0.20s IDLE → 0.51s CONNECTING → 0.51s READY → 0.51s IDLE → 0.81s CONNECTING → 0.81s TRANSIENT_FAILURE通道状态是子连接状态的汇总,READY 只表示至少有一个可用,不能代替对每个后端的健康监控。