在两个Go协程中监听Pods,两者会收到相同事件吗?
K8s Pod Watch 多协程监听的事件一致性问题
我的实现代码:
watch, err := s.clientset.CoreV1().Pods("").Watch(context.TODO(), metav1.ListOptions{ FieldSelector: fmt.Sprintf("spec.myfoo=%s", s.foo), }) for event := range watch.ResultChan() { // 事件处理逻辑 }
问题:
如果在两个不同的Go协程中实现完全相同的监听逻辑,这两个监听会收到相同的事件吗?还是会因接收顺序差异而收到不同的事件?
解答:
- 两个协程里的Watch是独立的API请求,各自和K8s API Server建立单独的连接,所以会收到完全相同的匹配事件,不会出现某一个协程漏收事件的情况
- 事件的接收顺序可能存在细微差异:API Server会分别向每个Watch连接推送事件,网络波动、本地协程调度的差异,可能导致同一事件在两个协程中被读取到的时间点不一样,但事件的内容是完全一致的
- 额外说明:每个Watch请求启动时,都会先同步一次当前符合筛选条件的Pod全量快照(相当于先执行一次LIST),再推送后续的增量事件,所以两个监听的初始全量数据和后续增量事件都是完整且匹配的
内容的提问来源于stack exchange,提问作者Rajeshwar
相关产品推荐
相关产品推荐

