Zookeeper-watch

2020-12-19  本文已影响0人  麦大大吃不胖

by shihang.mai

1. 场景

场景:假如有这么一个场景,client1 down后client2要做某些逻辑
有以下两个方案

  1. client2直接定时监听client1心跳,client1 down,然后自己做逻辑(下图绿色部分)
  2. 利用zk的watch机制(下图黑色部分)
    结论:显然选择zk方案,因为比定时监听及时.
zk的watch机制

2. watch机制

  1. 假设有一个目录/ooxx
  2. Client1在该目录下创建一个临时节点a,基于session,代表自己,如图所示的node节点,Client1挂掉,session消失,会产生事件.
  3. Clinet2通过统一试图(zk集群),获取到node节点,并watch event事件
  4. 如果Client1挂掉,那么事件触发,就会callback Client2

2.1 watch有两类

  1. 在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;
    }
}
  1. 针对node节点事件的watch,并且是一次性的,要连续监听的话,需要重新注册

注意:
watch注册只发生在读命令调用,如get exists。写命令是产生事件的,所以没watch。

zk.getdata("/ooxx",true,stat),其中第二个参数为true时,注册的是new zookeeper时的watch

上一篇下一篇

猜你喜欢

热点阅读