【问题标题】:go client watch etcd event has failedgo client watch etcd 事件失败
【发布时间】:2019-10-28 07:14:56
【问题描述】:

当我使用 etcd 客户端 go.etcd.io/etcd/clientv3 观看 etcd 事件时,我发现我会收到许多带有空事件的响应。 在下面登录:

ime="2019-10-27T20:39:13+08:00" level=debug msg="ETCD 观察响应: {Header:{ClusterId:0 MemberId:0 Revision:0 RaftTerm:0} 事件:[] CompactRevision:0 已取消:false 创建:false closeErr: cancelReason:}" file="backend.go:135" time="2019-10-27T20:39:13+08:00" level=debug msg="ETCD 观察响应:{Header:{ClusterId:0 MemberId:0 修订:0 RaftTerm:0} 事件:[] CompactRevision:0 已取消:false Created:false closeErr: cancelReason:}" file="backend.go:135" time="2019-10-27T20:39:13+08:00" level=debug msg="ETCD watch response: {Header:{ClusterId:0 MemberId:0 Revision:0 RaftTerm:0} 事件:[] CompactRevision:0 已取消:false 创建:false closeErr: cancelReason:}" file="backend.go:135" time="2019-10-27T20:39:13+08:00" level=debug msg="ETCD 观察响应:{Header:{ClusterId:0 MemberId:0 修订:0 RaftTerm:0} 事件:[] CompactRevision:0 已取消:false Created:false closeErr: cancelReason:}" file="backend.go:135" time="2019-10-27T20:39:13+08:00" level=debug msg="ETCD watch response: {Header:{ClusterId:0 MemberId:0 Revision:0 RaftTerm:0} 事件:[] CompactRevision:0 已取消:false 创建:false closeErr: cancelReason:}" file="backend.go:135" time="2019-10-27T20:39:13+08:00" level=debug msg="ETCD 观察响应:{Header:{ClusterId:0 MemberId:0 修订:0 RaftTerm:0} 事件:[] CompactRevision:0 已取消:false Created:false closeErr: cancelReason:}" file="backend.go:135" time="2019-10-27T20:39:13+08:00" level=debug msg="ETCD watch response: {Header:{ClusterId:0 MemberId:0 Revision:0 RaftTerm:0} 事件:[] CompactRevision:0 已取消:false 创建:false closeErr: cancelReason:}" file="backend.go:135" time="2019-10-27T20:39:13+08:00" level=debug msg="ETCD 观察响应:{Header:{ClusterId:0 MemberId:0 修订:0 RaftTerm:0} 事件:[] CompactRevision:0 已取消:false Created:false closeErr: cancelReason:}" file="backend.go:135"

提示:backend.go:135 是: fmt.Printf("%v", resp),resp是从watchChan收到的

   func (e *EtcdClient) watchWithOptions(ctx context.Context, key string, opts ...clientv3.OpOption) clientv3.WatchChan {
    if e.client == nil {
        return nil
    }

    key = e.withPrefix(key)

    return e.client.Watch(ctx, key, opts...)
}

// WatchPrefix watch the kvs change with same prefix
func (e *EtcdClient) WatchPrefix(ctx context.Context, prefix string) clientv3.WatchChan {
    return e.watchWithOptions(ctx, prefix, clientv3.WithPrefix(), clientv3.WithPrevKV())
}

除了put、delete事件,实际输出的是无效的空事件

【问题讨论】:

    标签: go etcd


    【解决方案1】:
    package main
    
    import (
        "context"
        "fmt"
        "time"
    
        clientv3 "go.etcd.io/etcd/clientv3"
    )
    
    func main() {
        cli, err := clientv3.New(clientv3.Config{
            Endpoints:   []string{"localhost:2379", "localhost:22379", "localhost:32379"},
            DialTimeout: 5 * time.Second,
        })
        if err != nil {
            // handle error!
        }
        defer cli.Close()
        ctx := context.Background()
        rch := cli.Watch(ctx, "foo")
        for wresp := range rch {
            for _, ev := range wresp.Events {
                fmt.Printf("%s %q : %q\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
            }
        }
    }
    

    如果您还没有看到,请查看文档中的example

    要进一步调试,您介意分享您的代码吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-20
      • 2021-03-28
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2014-08-04
      相关资源
      最近更新 更多