掘金 后端 ( ) • 2021-09-18 16:23
在Watch流程中的各角色内部循环,基本上也保持着跟以上示例代码相似的结构,都是通过select检查ctx.Done()是否不阻塞了,从而执行关闭循环的逻辑。
在watchGrpcStream的内部大循环中,有case err := 这条路径,其中err是serveWatchClient循环在接收到ETCD服务端发来的错误时转发过来的,但不一定会导致Watch流程关闭,根据错误的不同,可能会被关闭,也可能会自动重启。
这里,watchGrpcStream的ctx已经被传进去了,所以一旦这个ctx关闭,resp, err := wc.Recv()这里也会马上返回resp = nil、err = context.Canceled,不会再阻塞代码 ... 阅读全文