求zookeeper大神指点小弟疑惑

Intboy 2016-06-16 06:01:48
加精
对zookeeper的watcher有些疑惑
zookeeper其中有个功能就是可以做配置管理,现在我们就有个业务场景,业务系统有N个,并且上面都有相同配置,现在我需要用zookeeper做配置管理,业务流程如下图:


从图可以很容易的看明白业务流程。
1:业务系统watch zookeeper上相关配置数据;
2:配置中心更新zookeeper上配置;
3:zookeeper将数据更新通知到业务系统;
4:业务系统更新配置数据。

上面是一个完整的配置更新流程,现在问题如下:
1:zookeeper中的watcher只是单次有效,即:我业务系统起来的的时候去watcher配置数据,如果有更新,watcher处理更新,此时watcher就失效,如果再有数据更新的时候业务系统就收不到通知了。这个怎么处理?(业务系统收到更新后再次去watcher么?)
2:如果是更新数据后继续watcher配置数据,那这样的话就相当于业务系统必须一直有个线程阻塞着等待zookeeper上数据发生变化了。有没有其他方式处理?


阻塞等待式如下代码:
public class DataChange
{
// private static final Log LOGGER = LogFactory.getLog(DataChange.class);

public static void main(String[] args) throws Exception
{
CountDownLatch countDownLatch = new CountDownLatch(1);

ZooKeeper zkeeper = new ZooKeeper("localhost", 1000, new Watcher()
{
@Override
public void process(WatchedEvent event)
{
if (event.getState() == KeeperState.Disconnected)
{
countDownLatch.countDown();
}
}
});
dataChange(zkeeper);
countDownLatch.await();
zkeeper.close();
}

private static void dataChange(ZooKeeper zkeeper) throws KeeperException, InterruptedException
{
if (null != zkeeper.exists("/root/child", true))
{
zkeeper.getData("/root/child", new Watcher()
{
@Override
public void process(WatchedEvent event)
{
System.out.println("data change : " + event);
try
{
dataChange(zkeeper);
} catch (KeeperException e)
{
e.printStackTrace();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}, null);
}
}
}
...全文
1646 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
一起学IT技能 2016-07-28
  • 打赏
  • 举报
回复
zkclient规避了这个问题
大雨将至 2016-06-21
  • 打赏
  • 举报
回复
可以用zkclient,订阅一个感兴趣的节点事件就行了,zkclient负责处理watch的部分 http://blog.csdn.net/autfish/article/details/51576695 这里有一个例子
cattpon 2016-06-18
  • 打赏
  • 举报
回复
这个讨论题贴不错~
qq_15915835 2016-06-17
  • 打赏
  • 举报
回复
第一个问题只能从源码里面找答案了。我猜测是不是因为zk是多节点的。永久的watch会有问题--只是一个猜测
Intboy 2016-06-17
  • 打赏
  • 举报
回复
引用 2 楼 qq_15915835 的回复:
1.现在都是这么处理的,收到更新后,再去watch一次。 2.pubsub都得这么做吧。wait的线程又不消耗资源
终于有回答了,感谢。 因为我觉得zookeeper既然做了配置管理的这个功能,为什么又把watcher做成只一次生效,让业务自己每次去新建watcher,为何不做成永久生效的watcher。 这样就多一个线程资源嘛
qq_15915835 2016-06-17
  • 打赏
  • 举报
回复
1.现在都是这么处理的,收到更新后,再去watch一次。 2.pubsub都得这么做吧。wait的线程又不消耗资源
Intboy 2016-06-17
  • 打赏
  • 举报
回复
没一个人知道么?
bella20100531 2016-06-17
  • 打赏
  • 举报
回复
用curator框架, PathChildrenCache pcc = new PathChildrenCache(client, path, true); pcc.start(StartMode.POST_INITIALIZED_EVENT); pcc.getListenable().addListener(new PathChildrenCacheListener() { @Override public void childEvent(CuratorFramework arg0, PathChildrenCacheEvent event) throws Exception { //节点的变化事件 } });
Intboy 2016-06-17
  • 打赏
  • 举报
回复
引用 11 楼 fengspg 的回复:
[quote=引用 9 楼 shijing266 的回复:] 建议版主大大跟我们讲讲zookeeper的原理和使用,最好弄两个案例 另外,不该吝啬分数哦~
我也是刚开始看zookeeper。发帖没关注分数的习惯,现在加了分了。[/quote]原来已经被加分了。。。。
Intboy 2016-06-17
  • 打赏
  • 举报
回复
引用 9 楼 shijing266 的回复:
建议版主大大跟我们讲讲zookeeper的原理和使用,最好弄两个案例 另外,不该吝啬分数哦~
我也是刚开始看zookeeper。发帖没关注分数的习惯,现在加了分了。
  • 打赏
  • 举报
回复
引用 8 楼 qq_15915835 的回复:
[quote=引用 6 楼 shijing266 的回复:] 你说的就是zookeeper的观察者模式吧? Watcher是Zookeeper用来实现distribute lock, distribute configure, distribute queue等应用的主要手段。要监控data_tree上的任何节点的变化(节点本身的增加,删除,数据修改,以及孩子的变化)都可以在获取该数据时注册一个Watcher,这有很像Listener模式。一旦该节点数据变化,Follower会发送一个notification response,client收到notification响应,则会查找对应的Watcher并回调他们 需要注意的是,一旦Watcher被调用后,将会从map中删除,如果还需要关注数据的变化,需要再次注册。 Watcher的使用与注意事项 1.Watcher需要每次都要注册。 2.Watcher回调之后就销毁如果打算再次回调就需要再次注册
楼主的疑惑是为啥zk的实现每次notification都要重新watch...为啥不做成注册一次永久有效。。[/quote] 永久监听也有实现方式,只是说哪种更合理更适合你现在的项目 参考
  • 打赏
  • 举报
回复
建议版主大大跟我们讲讲zookeeper的原理和使用,最好弄两个案例 另外,不该吝啬分数哦~
qq_15915835 2016-06-17
  • 打赏
  • 举报
回复
引用 6 楼 shijing266 的回复:
你说的就是zookeeper的观察者模式吧? Watcher是Zookeeper用来实现distribute lock, distribute configure, distribute queue等应用的主要手段。要监控data_tree上的任何节点的变化(节点本身的增加,删除,数据修改,以及孩子的变化)都可以在获取该数据时注册一个Watcher,这有很像Listener模式。一旦该节点数据变化,Follower会发送一个notification response,client收到notification响应,则会查找对应的Watcher并回调他们 需要注意的是,一旦Watcher被调用后,将会从map中删除,如果还需要关注数据的变化,需要再次注册。 Watcher的使用与注意事项 1.Watcher需要每次都要注册。 2.Watcher回调之后就销毁如果打算再次回调就需要再次注册
楼主的疑惑是为啥zk的实现每次notification都要重新watch...为啥不做成注册一次永久有效。。
  • 打赏
  • 举报
回复
版主大大,参考下这个~

也就是说,每次用完之后,你需要重新去创建一个watcher

看下上面链接的下面这段文字
有两个方法initNodes 和 syncNodes, syncNodes主要是监听zookeeper的节点变化
syncNodes会通过级联方式,在每次watcher被触发后,就会再挂一次watcher。完成了一个类似链式触发的功能
  • 打赏
  • 举报
回复
你说的就是zookeeper的观察者模式吧? Watcher是Zookeeper用来实现distribute lock, distribute configure, distribute queue等应用的主要手段。要监控data_tree上的任何节点的变化(节点本身的增加,删除,数据修改,以及孩子的变化)都可以在获取该数据时注册一个Watcher,这有很像Listener模式。一旦该节点数据变化,Follower会发送一个notification response,client收到notification响应,则会查找对应的Watcher并回调他们 需要注意的是,一旦Watcher被调用后,将会从map中删除,如果还需要关注数据的变化,需要再次注册。 Watcher的使用与注意事项 1.Watcher需要每次都要注册。 2.Watcher回调之后就销毁如果打算再次回调就需要再次注册
Intboy 2016-06-17
  • 打赏
  • 举报
回复
引用 4 楼 qq_15915835 的回复:
第一个问题只能从源码里面找答案了。我猜测是不是因为zk是多节点的。永久的watch会有问题--只是一个猜测
问题?比如什么问题呢?

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧