etcd的lease是一个非常有用的机制,主要作用是给特定的key附加一个过期时间。既然调用client.Put方法已经可以把key和lease进行关联,为什么有个keepalive方法呢?
仔细阅读该方法的文档,以及进行实验,明白了keepalive的作用是自动续期租约,即当前context没有被cacel或者timeout,这个lease会一直被续租。
实验代码
func main() {
cli, err := etcd.GetCli()
if err != nil {
panic(err)
}
key := "/test/leader/hostname"
ctx := context.TODO()
lease, err := cli.Grant(ctx, 30)
if err != nil {
panic(err)
}
_, err = cli.Put(ctx, key, "abcd", clientv3.WithLease(lease.ID))
if err != nil {
panic(err)
}
_, err = cli.KeepAlive(ctx, lease.ID)
if err != nil {
panic(err)
}
fmt.Printf("%x\n", lease.ID)
select {}
}
在启动该程序之后,打开另一个窗口持续观察lease的过期时间
etcdctl lease timetolive 66d77fb9c1003ec0
会发现这个lease的ttl基本每隔几秒就会变为30s。
由此,验证了心中的疑惑。
网友评论