ZooKeeper Watch 回调事件丢失
来源:互联网 发布:超级计算机 云计算 编辑:程序博客网 时间:2024/06/03 03:51
ZooKeeper 在官网着重提示在使用 Watch 的时候要注意:
- Watch 是一次性的,如果 watch 事件发生了,还想 watch 需要再设置新的watch
- 因为 watch 的一次性,再次注册 watch 的网络延迟,所以 znode 每次变更不可能都 watch 到
- 一个 watch 对象或者函数/上下文对(pair),只会触发一次。比如,如果相同的 watch 对象注册了 exist 和 getData 调用在相同文件,并且文件已经被删除,watch 对象只会在文件被删除触发一次
- 当你与一个服务断开(比如zk服务宕机),你将不会获得任何 watch,直到连接重连。因此,session 事件将会发送给所有 watch 处理器。使用 session 事件进入一个安全模式:当断开连接的时候将不会收到任何事件,因此您的进程应该以该模式保守运行
用代码表现一下 Watch 回调事件丢失:
package com.wenniuwuren.zookeeper.curator.watch;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.cache.NodeCache;import org.apache.curator.framework.recipes.cache.NodeCacheListener;import org.apache.curator.retry.ExponentialBackoffRetry;import com.wenniuwuren.Constants;/** * Zookeeper之Watcher监听事件丢失 * * @author wenniuwuren */public class WatchLost { static String path = "/test/watchlost1"; static CuratorFramework client = CuratorFrameworkFactory.builder().connectString(Constants.ZK_HOST) .retryPolicy(new ExponentialBackoffRetry(1000, 3)).build(); public static void main(String[] args) { try { client.start(); final NodeCache nodeCache = new NodeCache(client, path); nodeCache.start(); if (client.checkExists().forPath(path) == null) client.create().forPath(path, "0".getBytes()); nodeCache.getListenable().addListener(new NodeCacheListener() { @Override public void nodeChanged() throws Exception { if (nodeCache.getCurrentData() == null) { System.out.println("节点被删除"); } else { System.out.println("节点当前内容为:" + new String(nodeCache.getCurrentData().getData())); } } }); client.setData().forPath(path, "1".getBytes()); client.setData().forPath(path, "2".getBytes()); client.setData().forPath(path, "3".getBytes()); client.setData().forPath(path, "4".getBytes()); client.setData().forPath(path, "5".getBytes()); client.setData().forPath(path, "6".getBytes()); client.setData().forPath(path, "7".getBytes()); client.setData().forPath(path, "8".getBytes()); client.setData().forPath(path, "9".getBytes()); } catch (Exception e) { e.printStackTrace(); } }}
多次的运行结果:
运行结果一:节点当前内容为:9节点当前内容为:3节点当前内容为:4节点当前内容为:5节点当前内容为:6节点当前内容为:7节点当前内容为:8节点当前内容为:9运行结果二:节点当前内容为:9节点当前内容为:2节点当前内容为:3节点当前内容为:4节点当前内容为:5节点当前内容为:6节点当前内容为:7节点当前内容为:8节点当前内容为:9运行结果三:节点当前内容为:9节点当前内容为:3节点当前内容为:4节点当前内容为:6节点当前内容为:7节点当前内容为:8节点当前内容为:9
运行几次,可以看到,并不是每次 client 都是收到 watch 回调,会漏掉几次。所以在使用 ZooKeeper Watch 的时候,不能觉得监听回调一定会成功,所以在写代码的时候要注意这一点。
阅读全文
0 0
- ZooKeeper Watch 回调事件丢失
- zookeeper之watch事件延迟
- 【zookeeper】事件 watch 机制 原理
- [ZooKeeper]ZooKeeper的Watch事件类型
- ZKClient zookeeper 丢失事件 分析
- zookeeper watch
- Zookeeper之Watcher监听事件丢失分析
- zookeeper的watch事件反复监听实现细节
- Zookeeper Watch机制
- zookeeper watch 节点
- Zookeeper Watch机制
- Zookeeper Watch监听
- Zookeeper Watch机制
- Zookeeper系列(十三)Zookeeper开源客户端之Curator的事件监听丢失分析
- ZooKeeper之观察者(watch)
- angularjs-watch 监视事件
- ZooKeeper Client 如何管理Watch(一):注册和存储Watch
- 一个简单的 Zookeeper Watch 客户端
- 基于php+mysql的博客设计
- HDU : Oil Deposits
- 第一个煮蛋的人
- MATLAB的使用(四)运算符、关系与逻辑函数说明以及预定义变量名说明
- CPP入门基础知识
- ZooKeeper Watch 回调事件丢失
- sigmoid函数求导与自然指数
- [C/C++]读取文件的多种方式
- 创建类Student和对象
- python--leetcode566. Reshape the Matrix
- 读书笔记:C和指针6
- printf()函数
- Git—4、远程库操作
- 如何去掉字符串最后的逗号?