zookeeper watches

在zookeeper中所有的读操作getData(), getChildren() 和 exists() 可以有一个选项设置一个观察(watch)。一个观察是一个单次的触发器,当这个观察设置的数据发生变化的时候,客户就会接到一个通知。以下是几个比较重要的点:

     单次的触发:

     如果一个客户做了getData("/znode1", true),然后/znode1的数据被改变了或者删除了,该客户就会得到一个观察事件。如果/znode1的数据又被改变了,这个客户将不会再收到通知,除非它再次进行读操作,并设置一个新的观察。

     发送到客户:

     Zookeeper提供了一致性保证:一个客户首先会受到观察事件之后,才看到数据的变化。也就是说,没有收到事件之前,客户是不会看到数据变化的。关键点就是,所有被不同客户看到的事情都具有一个一致性的顺序。

     观察设置的数据:

      zookeeper有两组观察:数据观察(data watches)和子观察(child watches)。getData() 和 exists() 设置数据观察,getChildren()设置子观察。setData() 将会触发数据观察,create()将会触发数据观察和其父节点的子观察。delete()同样会出发数据观察和其父节点的子观察。

      所有的观察是在维护在客户连接的服务器本地。这个可以使得更容易去设置,维护和分发。当一个客户连接一个新的服务器的时候,这个观察将会被所有session事件触发。当从服务器断开连接的时候,观察不会被接收到。当一个客户重新连接的时候,任何事先被注册的观察将被重新注册和出发(如果有需要的话)。通常情况下,这个都透明的发生。有一种情况观察会被错过,如果设置了一个是znode否存在的watch。这个znode在客户断开连接的时候被创建,那么这个事件就会被丢失。

 zookeeper对于观察的保证: 

        1.观察对于其他事件,其他观察,和异步回复都的是有序的。zookeeper库会保证所有事情按顺序被分发。

        2.客户会先受到观察时间,然后才会看到新的数据。

        3.来自zookeeper观察事件的顺序与zookeeper服务看到的更新一致(这个是个什么意思?)

关于观察需要记住的几点:

        1.观察是单次触发,如果你得到一个观察事件,而且你想得到新改变的事件,你必须设置另外一个观察。

        2.因为是单次触发,所以得到观察事件和设置新的观察之间有一个延迟。你可能不可能可靠的看到所有的变化,注意处理这种情况。

        3.设置多个同样的观察实体,观察只会被触发一次。

        4.当你从一个服务器断开连接的时候(比如服务器挂掉了),你不会得到任何事件,直到连接被重新建立。由于这个原因,会话事件将被发送到所有的外部观察处理器。使用会话事件去进入安全模式,当断开连接的时候,你将不会受到事件。所以在进入这个模式的时候,你的进程需要表现的保守一些。

原文地址:https://www.cnblogs.com/zhangzhang/p/2864416.html