服务发版重启时怎么才能不丢请求?Stop 和 GracefulStop 差在哪?会不会关不掉?关闭之后 handler 还在跑吗?这篇用 16 路持续负载把每一种关闭方式的失败数都数出来。
Stop() 调用本身用了 0.2 ms;客户端的在途调用:code=Unavailable message="error reading from server: EOF",102.7 ms 后返回 GracefulStop() 调用本身用了 400.4 ms;客户端的在途调用:成功,501.6 ms 后返回
Stop 立刻断开所有连接,在途调用失败。GracefulStop 先不再接受新请求(发 GOAWAY),等在途的调用做完再关,在途调用成功。
GracefulStop 等了 2002.1 ms,仍然没有返回 再调用 Stop():GracefulStop 在 2002.8 ms 后才返回;长流的客户端:code=Unavailable message="closing transport due to: connection error: desc = \"error reading from…"
GracefulStop 没有超时。有不结束的长流时它一直等。常见做法:GracefulStop 加超时,超时后再 Stop。
Stop() 总调用 2184,失败 8;关闭动作用了 0.4 ms;关闭之后后端 0 又收到 0 次、后端 1 共 1814 次;第一个失败:code=Unavailable message="error reading from server: EOF" GracefulStop() 总调用 2208,失败 0;关闭动作用了 15.7 ms;关闭之后后端 0 又收到 0 次、后端 1 共 1839 次;第一个失败:(没有失败) 先 health.Shutdown,等 300 ms,再 GracefulStop() 总调用 2400,失败 0;关闭动作用了 301.0 ms;关闭之后后端 0 又收到 0 次、后端 1 共 2040 次;第一个失败:(没有失败)
在持续负载下,Stop 会让关闭时正在处理的调用失败;GracefulStop 做到 0 失败。先把健康状态设为 NOT_SERVING 再 GracefulStop,让依赖健康检查的负载均衡器有时间摘掉节点。
WaitForHandlers(false) Stop() 用了 0.1 ms;Stop 返回时仍在运行的 handler 1 个 WaitForHandlers(true ) Stop() 用了 802.3 ms;Stop 返回时仍在运行的 handler 0 个
Stop 默认不等 handler 返回,Stop 之后 handler 可能仍在运行。需要的话用 WaitForHandlers(true)(实验性选项),或自己等待。