zookeeper

zookeeper的重连思考

2016-10-14  本文已影响1622人  本初gg

先谈谈watcher和watcheEvent

刚学zookeeper的时候,都会被坑一次,以为watcher的监听是永久的。其实不然,watcher在大多数时候都只调用一次。
zookeeper使用HashMap<Path,Watcher>维护了所有路径的watcher,

private static class ZKWatchManager implements ClientWatchManager {    
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>>();

所有不论注册多少次,都只会有一个watcher存在。当watcheEvent产生的时候,会移除对应path的watcher,并且回调。

然而,当type=None的时候,就不会移除watcher,会向所有watcher发送事件。


Paste_Image.png

何时会产生type=None的事件呢?状态转变的时候!

Paste_Image.png

初始化的sessionState=Disconnected
所以第一次ping成功,(zookeeper client会不断的给server发送ping指令)
会产生一个watchEvent:State=SyncConnected,type=None
此时sessionState=SyncConnected,所以后续的ping就不会产生事件了。
当zk监听watcher的时候,如果发生网络断链,且在sessionTimeout/2的时间内都没有恢复连接。
那么所有注册的watcher都会接收到
state=Disconnected,type=None,path=Null的watchEvent
此时sessionState=Disconnected..

所以对于watcheEvent的事件的处理方式是:

再谈谈zookeeper客户端操作的Code

Code表示你这次操作的结果

例如对于delete(path,version)

那么如果是断连呢?

所以对于rc处理方式是:

对于zookeeper的初略理解,有问题可以指点指点。
另外关于测试。
模拟zookeeper的sessionExpired可以看看curator的KillSession

上一篇 下一篇

猜你喜欢

热点阅读