美文网首页
Zookeeper(二)监视(Watches)及回调函数

Zookeeper(二)监视(Watches)及回调函数

作者: 顽强的猫尾草 | 来源:发表于2018-08-14 17:58 被阅读30次

建立连接

这个步骤很简单,直接参照源码使用即可:

/*
bool ZkClient::Connect(int timeout, ZooLogLevel log_level) {
    VLOG(LEV) << "Connecting " << address_;
    timeout_ = timeout;
    log_level_ = log_level;
    zoo_set_debug_level(log_level);
    if (!DoConnect(timeout)) return false;
    return true;
}
*/
ZkClient zk_client;
zk_client.Connect();

监视

Zookeeper 所有的读方法 GetData()Exists()GetChildren() 都可以设置监视(Watches),前两者监视传入的节点,后者监控传入节点的子节点。函数原型如下:

// watcher: if non-null, a watcher will be set at the server to notify
//          the client if the node changes.
// global_watch: if true, a global watch will be set.
//               When watcher is non-null, global_watch is ignored.
// struct NodeData {
//    std::string path;
//    std::string value;
//    Stat stat;
// };

bool GetData(const std::string& path,
             NodeData* node_data,
             EventWatcher* watcher = NULL,
             bool global_watch = false);

bool Exists(const std::string& path,
            EventWatcher* watcher = NULL,
            bool global_watch = false);

bool GetChildren(const std::string& path,
                 std::vector<std::string>* children,
                 EventWatcher* watcher = NULL);

监视事件可以理解为一次性的触发器。当设置监视的节点或其数据发生改变时,该监视事件会被发送到客户端。由于网络或其他因素可能导致不同的客户端感知到某一监视事件存在延迟,但不同的客户端所看到的一切监视具有保序性

为了更好地阐述 Watch 所做的工作,假设 ZK 服务器上有如下结构(引号内是对应节点的 value):

/
- /root ""
- - /root/kafka ""
- - /root/redis ""
- - - /root/redis/1 "table1"
- - - /root/redis/2 "table2"
- /local ""
- - /local/test ""

Exists("/root/redis") 返回一个 bool 值,指示该节点是否存在。
GetChildren("/root/redis", vec)获取 /root/redis 节点的所有子节点,保存在 vec 中。
GetData("/root/redis", node_data) 获取 /root/redis/1 节点的值,保存在 node_data 结构体中。

在以上例子中,我们没有设置回调(Watch 为 null),节点信息的获取是一次性的,变更时不会通知客户端。这样没有发挥这个函数异步调用的特性。

Watch 的设置是通过回调函数的方式实现的,例如在 Zookp 类内定义 UpdateNode() 方法作为设置 Watch 监视变更的函数,HandleEvent() 方法作为监视到变更时的回调函数,这两个方法的实现应如:

void Zookp::HandleEvent() {
    std::cout << "the watch node is changed, update!" << std::endl;
    UpdateNode();    // recursive call, to ensure monitor the child node permanently
}
void Zookp::UpdateNode() {
    std::vector<std::string> children;
    zk_->GetChildren(path, &children, base::NewOneTimeCallback(this, &Zookp::HandleEvent));
    // deal with node and data info here
    ...
}

相关文章

  • Zookeeper(二)监视(Watches)及回调函数

    建立连接 这个步骤很简单,直接参照源码使用即可: 监视 Zookeeper 所有的读方法 GetData()、Ex...

  • Vue监视属性

    一、监视属性watch 1、当被监视的属性变化时,回调函数(handler)自动调用,进行相关操作2、监视的属性必...

  • 监视属性—watch

    当被监视的属性变化时,回调函数自动调用,进行相关操作 监视的属性必须存在,才能进行监视 监视的两种不同写法(请看 ...

  • 侦听属性watch 、watch与computed的区别

    监视属性watch: 1、当被监视的属性发生变化时,回调函数自动调用,进行相关操作 2...

  • vue学习(13)监视属性

    知识点 1:watch监视属性(1)当被监视的属性发生变化时,回调函数自动调用,进行相关操作。(2)监视的属性必须...

  • 监视属性watch

    监测属性 1.当被监测的属性变化时,回调函数会自动调用,进行相关操作 2.监视的属性必须存在,才能进行监视!!! ...

  • JavaScript函数_08回调函数

    回调函数 回调函数(回调),当我们把某个函数作为参数传递给另一个函数的时候,这个函数就是回调函数 回调函数的基本写...

  • 封装map方法

    map特性:1.参数一为回调函数,回调函数里面有三个参数,数组元素,下标和数组,参数二为回调函数的this指向。默...

  • Promise

    回调 把一个函数A传给另一个函数B调用,那么A就是回调函数。 回调地狱 回调套回调套回调套回调套回调套回调套回调....

  • js中回调函数的学习笔记

    回调函数是什么在学习之前还真不知道js回调函数怎么使用及作用了,下面本文章把我在学习回调函数例子给各位同学介绍一下...

网友评论

      本文标题:Zookeeper(二)监视(Watches)及回调函数

      本文链接:https://www.haomeiwen.com/subject/thnvbftx.html