by shihang.mai
1. 场景
场景:假如有这么一个场景,client1 down后client2要做某些逻辑
有以下两个方案
- client2直接定时监听client1心跳,client1 down,然后自己做逻辑(下图绿色部分)
- 利用zk的watch机制(下图黑色部分)
结论:显然选择zk方案,因为比定时监听及时.
2. watch机制
- 假设有一个目录/ooxx
- Client1在该目录下创建一个临时节点a,基于session,代表自己,如图所示的node节点,Client1挂掉,session消失,会产生事件.
- Clinet2通过统一试图(zk集群),获取到node节点,并watch event事件
- 如果Client1挂掉,那么事件触发,就会callback Client2
2.1 watch有两类
- 在new Zookeeper(ip,session timeout,watch)传入的watch,是session级别的,就是说连接状态,和path、node没关系的
public void process(WatchedEvent event) {
switch (event.getState()) {
case Unknown:
break;
case Disconnected:
break;
case NoSyncConnected:
break;
case SyncConnected:
break;
case AuthFailed:
break;
case ConnectedReadOnly:
break;
case SaslAuthenticated:
break;
case Expired:
break;
}
switch (event.getType()) {
case None:
break;
case NodeCreated:
break;
case NodeDeleted:
break;
case NodeDataChanged:
break;
case NodeChildrenChanged:
break;
}
}
- 针对node节点事件的watch,并且是一次性的,要连续监听的话,需要重新注册
注意:
watch注册只发生在读命令调用,如get exists。写命令是产生事件的,所以没watch。
zk.getdata("/ooxx",true,stat),其中第二个参数为true时,注册的是new zookeeper时的watch
网友评论