etcd watch原理
粗浅了解,如有错误之处,请指教!
服务初始化
etcd 启动时会注册 WatchServer[1], pb.WatchServer 用于处理 watch 请求
接收 watch 请求
- 每一个 watch 流都创建一个 serverWatchStream 结构体
- 开启两个 goroutine, sendLoop 用于发送 watch 消息到流中,recvLoop 接受请求
- select 阻塞直到流关闭,或是超时退出。
1.接收 watch 请求 recvLoop
recvLoop 从 gRPCStream 读出 req, 然后分别处理类型为 CreateRequest, CancelRequest, ProgressRequest 的情况
- CreateRequest: 监听的可能是一个范围,所以构建 key 和 RangeEnd. 处理 StartRevision, 如果为 0, 那么使用当前 系统最新的 Rev+1. 调用 mvcc 层的 watchStream.Watch, 返回一个 watchid, 将这个 id封装到watchResponse,再将watchResponse 写到 ctrlStream