2020-08-19

Zookeeper Watch

概要:zookeeper watch为了对znode数据变更时间进行监听。客户端在使用zookeeper接口访问zookeeper时,如果注册了watch实例,那么当zookeeper znode节点有数据变更时,zkserver会发送watchevent给客户端,发送完后watch实例将移除,wath时间只发生异常,如需要再次监听,客户端需要注册watch实例到zkserver端。zookeeper目前只支持监听事件一次发送。

zkserver watch只能接受一次watchevent分析

客户端分析:

对zookeeper源码分析可以发现Zookeeper类实现客户端对zkserver进行访问,ClientCnxn类实现了客户端对zkserver访问的链接处理,Zookeeper.ZKWatchManager实现对服务端发送过来的watchevent pack数据解析。ClientCnxn中的SendThread复制接受zkserver发送过来的watchevent数据处理,在处理的过程中对使用Zookeeper.ZKWatchManager的materialize方法对发送过来的wathevent数据进行解析转换成Watch实例。zkserver在znode数据发送变化时,实际会连续发送3个事件:SyncConnected -> DataNodeChanged -> Close。再看meterialize代码可见,meterialize方法会在第一 个事件发送完后的事件对zookeeper实例中的watchset中的watch清除。所以在客户端处理完后之前注册watch实例不生效。

clear清除标记
清除datawatchs中的内容
清除childwatchs中的内容

服务端分析:

LeaderZookeeperServer负责,LeaderRequestProcessor、PreRequestProcessor、ProposalRequestProcessor、CommitProcessor

、FinalRequestProcessor实现对客户端发送过来的pack数据处理。对FinalRequestProcessor类进行分析可以发现:

FinalRequestProcessor对客户端发送来的watchevent处理

zkserver会在ZKDatabase实例中注入watch实例并将watch实例注入到DataTree中。对DataTree进行分析可以发现,当数据发生变化时,会触发数据变事件:

数据变更触发watchevet事件

dataWatches childWatches实际上是WatchManager的实例,对WatchManager实例进行分析可以发现:


watchevent事件处理时会将watch监听实例移除


综上所述:

客户端在watchevent事件发生后会将watch实例移除,服务端也会将watch实例移除。所以watch事件只是一次生效。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容