ZooKeeper学习之关于Servers和Watches
程序员文章站
2022-06-12 11:49:35
...
watch是由read operation设置的一次性触发器,由一个特定operation来触发。为了在server端管理watch,ZK的server端实现了watch manager。一个WatchManager类的实例负责管理当前已被注册的watch列表,并负责触发它们。所有类型的server(包括standalone,leader,follower和observer)使用同样的方式处理watch。
DataTree类持有一个watch manager来维护所有类型的watch和一些附加的数据,当处理一个带有watch的read operation时,此类就会把这个watch加入manager的watch列表。类似的,当处理一个事务时,此类会查明是否需要触发相应的watch。如果发现有watch需要触发,此类就会调用manager的触发方法。添加一个watch和触发一个watch都会以一个read请求或者FinalRequestProcessor类的一个事务开始。
在server端触发了一个watch,会传播到client。此类使用server cnxn对象来处理(参见ServerCnxn类),此对象管理client和server的连接并实现了Watcher接口。Watch.process方法序列化了watch event,并通过网络发送出去。client接收到了序列化数据,转换成watch event对象,并传递到应用程序。watch只会保存在内存,不会持久化到硬盘。当client断开与server的连接时,它的所有watch会从内存中清除。因为client的库也会维护一份watch的数据,在重连之后watch数据会再次被同步到server端。