谢邀,才看到抱歉,首先读流程linearizable读时,你理解有误,leader并未返回key value数据给client,而是返回最新的commited index给follower节点,follower需要等待本地的appliedIndex >= leader的commitIndex才会返回数据给client. 详细可参考我们团队小伙伴写的一篇故障分析,里面有简要提及。https://mp.weixin.qq.com/s/VJi1jzTK2G7bH1pi4ND7Yw
第二点watch不需要发送给leader, 可以发送给follower, 若集群中存在一个落后很多follower节点,可能会导致变更推送延迟,同时如果出现网络分区了,你可能无法获取到最新数据变化通知,当然你也可以通过指定watch 参数clientv3.WithRequireLeader(ctx)),来要求集群一定有leader, 没有leader会返回错误给你,可以参考这个代码https://github.com/etcd-io/etcd/blob/master/proxy/grpcproxy/leader.go,相关issuehttps://github.com/etcd-io/etcd/issues/7321