Zookeeper系统许多重要的功能都是基于Watcher机制实现的,比如发布订阅模型,分布式通知/协调模型等。本质上来说,它更像是一个分布式的观察者模式实现,对模式设计比较熟悉的同学会对此有更好的理解。本文分三个部分,第一部分详解Server端和Client端是通过什么数据结构对Watcher进行管理维护的;第二部分从注册Watcher和Watcher触发两个方面介绍下Zookeeper是如何工作的;第三部分结合代码对Watcher的常见问题进行一下解释
第一部分:Zookeeper对Watcher的管理维护数据结构
private final Map<String, Set<Watcher>> dataWatches =
new HashMap<String, Set<Watcher>>();
private final Map<String, Set<Watcher>> existWatches =
new HashMap<String, Set<Watcher>>();
private final Map<String, Set<Watcher>> childWatches =
new HashMap<String, Set<Watcher>>();
|
private final HashMap<String, HashSet<Watcher>> watchTable =
new HashMap<String, HashSet<Watcher>>();
private final HashMap<Watcher, HashSet<String>> watch2Paths =
new HashMap<Watcher, HashSet<String>>();
|
public void process(WatchedEvent event) {
ReplyHeader h = new ReplyHeader(-1, -1L, 0);
WatcherEvent e = event.getWrapper();
try {
sendResponse(h, e, "notification");
} catch (IOException e1) {
if (LOG.isDebugEnabled()) {
LOG.debug("Problem sending to " + getRemoteSocketAddress(), e1);
}
close();
}
}
|
本文来自网易实践者社区,经作者范欣欣授权发布。