Golang Go语言中Etcd的watch chan被close,不知道应该如何复现

发布于 1周前 作者 sinazl 来自 Go语言

看了下 watch 的说明,在指定 watch 的 revision 被 compact 时或者 context 取消或到期,watch chan 会被 close 。 以下是我遇到的一个疑似被 close 的场景,已知问题是(服务存在大量与 etcd 的短连接)。

for {
     ach := etcdClientV3.Watch(context.Background(), "/test", clientv3.WithPrefix())
     for {
          select {
             case wch := <- ach {
                   fmt.Println("recv chan")    
             }
          }
     }
}

尝试过往 etcdput 大量数据,再程序运行过程再 compact. 未能成功复现。


Golang Go语言中Etcd的watch chan被close,不知道应该如何复现

更多关于Golang Go语言中Etcd的watch chan被close,不知道应该如何复现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

用的什么环境,etcd 的版本是多少?

更多关于Golang Go语言中Etcd的watch chan被close,不知道应该如何复现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


sry ,忘记说了,etcd 版本是 3.3 。https://github.com/etcd-io/etcd/issues/8668 按这个 issue 的描述,compact 是可能会在这种场景导致 channel 被 close ,最终的复现方法比较另类,先在程序循环内断点断住,写入大量数据后,再执行 compact ,把断点去掉,等待一段时间可以复现

在Go语言中,使用Etcd的watch功能时,如果遇到了watch的channel被close的情况,这通常意味着客户端与Etcd服务器之间的连接出现了问题,或者Etcd服务端主动关闭了watch。要复现这种情况,可以从以下几个方面入手:

  1. 模拟网络问题:通过防火墙规则、网络限速工具或者断开网络连接的方式,模拟客户端与Etcd服务器之间的通信不稳定或中断,这可能会导致Etcd服务端关闭watch连接。

  2. Etcd服务端重启:在客户端启动watch后,重启Etcd服务端。由于Etcd服务端的重启会导致所有现有的watch连接被关闭,因此可以复现watch channel被close的情况。

  3. Etcd服务端配置变更:修改Etcd服务端的配置,比如调整watch的超时时间或者限制watch的数量,然后观察客户端是否会因为这些配置变更而接收到watch channel被close的信号。

  4. 客户端异常退出:虽然这不是Etcd服务端主动关闭watch,但模拟客户端异常退出后重新连接,也可以观察到watch连接被重建的过程,这有助于理解watch channel的生命周期管理。

通过上述方法,可以较为有效地复现Etcd watch channel被close的情况,从而进行进一步的调试和优化。在实际开发中,建议结合日志和监控工具,以便更准确地定位和解决问题。

回到顶部