栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ZooKeeper监听

ZooKeeper监听

一、一个客户端修改了某个节点的数据,其他客户端能够马上获得到这个最新数据吗
  • ZooKeeper不能确保人和客户端都能获得(即:Read Request)到一样的数据,除非客户端自己要求。客户端要求获取到一样的数据的方法是在获取数据之前调用org.apache.zookeeper.AsyncCallback.VoidCallback, java.lang.Object) sync
  • 在对获取的数据是否是最新版本不敏感或者一个客户端修改了数据其他的客户端不需要立即能够获取到最新数据的情况下,可以不关心这点
  • 在其他情况下,ZK客户端A对/my_test的内柔从v1->v2,但是ZK客户端B对/my_test的内容获取依然获得的是v1。解决的方法是让客户端B先调用sync()方法才调用getData()方法
二、ZooKeeper对节点的watch监听是永久的吗?
  • ZooKeeper对节点的watch监听不是永久的
  • 一个watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便于通知它们
  • 为什么不是永久的呢?因为如果服务端的变动十分频繁,而监听的客户端很多的情况下,每次变动都要通知到所有的客户端,这十分消耗性能。
  • 一般是客户端执行了getData(“/节点A”,true),如果节点A发生了变更或删除,客户端会得到它的watch事件,但是在之后节点A又发生了变更,而客户端又没有设置watch时间,就不再给客户端发送
  • 在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我们只需要最新的数据就可以了
三、ZooKeeper中使用watch的注意事项有哪些

使用watch需要注意的几点:

  1. Watches通知是一次性的,必须重复注册
  2. 发生CONNECTIONLOSS之后,只要在session_timeout之内再次连接上(即不发生SESSIONEXPIRED),那么这个连接注册的watches依然在
  3. 节点数据的版本变化会触发NodeDataChanged,注意,这里特意说明了是版本变化。存在这样的情况,只要成功执行了setData()方法,无论内容是否和之前一致,都会触发NodeDataChanged。
  4. 对某个节点注册了watch,但是节点被删除了,那么注册在这个节点上的watches都会被移除
  5. 同一个zk客户端对某一个节点注册相同的watch,只会收到一次通知
  6. Watcher对象只会保存在客户端,不会传递到服务端
四、客户端能否收到每次节点变化的通知?
  • 如果节点数据的更新频率很高的话,那么是不能的
  • 因为当一次数据修改时,通知客户端,客户端再次注册watch,在这个过程中,可能数据已经发生了许多次数据修改,因此千万不要做这种测试:“如果数据被修改了n次,那么就一定会收到n次通知”来测试server是否正常工作
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/457366.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号