watch的定义

在这个watch的定义中有三个要点需要考虑:

一次性: 当node的数据发生变化时,就是产生了一个事件,watch是一次性的,在被事件触发后这个watch就会失效.例如,如果client执行getData("/znode1",true),然后/znode1的数据被更改或删除,client将获得/znode1的watch事件。如果/znode1再次更改,则不会发送任何watch事件,除非客户端再次读取并设置了一个新的watch

这是一个很重要的知识点,就是一个watch会被反复的一类事件反复的触发么? 答案是不能,触发一次后watch就失效了,你需要再次设置watch来重新监听事件
有序性: 发生到client的watch事件和更新node数据的操作是有先后顺序的,也就是先进行了node数据更新,node数据更新成功后才会产生watch事件.client才能接到通知.可能有人认为zookeeper只要接到node数据更新操作就会产生watch事件,这个假设是错的,zookeeper做到分布式一致性其实是有严格的有序性的.watch事件是被异步发送到client的,同时对于同一个watch事件如果有多个client监听的话,由于网络延迟这些client可能会在事件的接受时间上有细微的偏差,不同客户端看到的所有操作依然有一致的顺序
watch事件是有类型的: node数据的改变可以分为2个了类型,一个是node的数据被改变,例外一个是node的子节点被改变. zookeeper因此维护了2种watch事件列表:getData()和exists()可以设置数据改变相关的watch,getChildren()可以设置node子节点相关的watch.我们在设置watch的时候需要按照上面的类型进行选择.

作者:郑连益 原文地址:https://segmentfault.com/a/1190000039222213

%s 个评论

要回复文章请先登录注册