ZooKeeper对Watch提供了什么保障
对于watch,ZooKeeper提供了这些保障:
- Watch与其他事件、其他watch以及异步回复都是有序的。 ZooKeeper客户端库保证所有事件都会按顺序分发。
- 客户端会保障它在看到相应的znode的新数据之前接收到watch事件。//这保证了在process()再次利用zk client访问时数据是存在的
- 从ZooKeeper接收到的watch事件顺序一定和ZooKeeper服务所看到的事件顺序是一致的。
关于Watch的一些值得注意的事情
- Watch是一次性触发器,如果得到了一个watch事件,而希望在以后发生变更时继续得到通知,应该再设置一个watch。
- 因为watch是一次性触发器,而获得事件再发送一个新的设置watch的请求这一过程会有延时,所以无法确保看到了所有发生在ZooKeeper上的 一个节点上的事件。所以请处理好在这个时间窗口中可能会发生多次znode变更的这种情况。(可以不处理,但至少要意识到这一点)。//也就是说,在process()中如果处理得慢而没有注册new watch时,在这期间有其它事件出现时是不会通知!!
- 一个watch对象或一个函数/上下文对,为一个事件只会被通知一次。比如,如果同一个watch对象在同一个文件上分别通过exists和getData注册了两次,而这个文件之后被删除了,这时这个watch对象将只会收到一次该文件的deletion通知。//同一个watch注册同一个节点多次只会生成一个event。
- 当从一个服务器上断开时(比如服务器出故障了),在再次连接上之前,将无法获得任何watch。请使用这些会话事件来进入安全模式:在disconnected状态下将不会收到事件,所以程序在此期间应该谨慎行事。