0
点赞
收藏
分享

微信扫一扫

zookeeper分布式协调

兔八哥软件爱分享 2022-04-21 阅读 104
java

业务描述

  • 将所有的配置数据配置到zk,其余服务对zk进行watch和get
  • zk进行创建连接的时候可以进行目录创建, 创建的目录的配置是进行隔离的。
  • 创建zk的时候可以使用countDownLatch.wait进行连接等待,在监听器中进行监听,当连接成功的时候线程继续进行。
  • zk读取可以进行同步和异步,异步的有一个回调函数,在回掉函数中进行调用读取数据代码
  • 进行异步调用的时候会反复的回调,可以创建工具类xxxCallBack对watch,statCallback,datacallback进行继承,同时实现三个接口,在调用的时候只需要创建一个对象进行传参。
  • 在主线程中创建线程的配置引用,传入xxxCallBack中,在获取数据成功的时候进行set,达到数据传输的目的
  • 同时 在数据回调的时候进行阻塞,等待数据取回的时候继续进行

数据改变的时候

  • 创建:进行数据读取
  • 删除:业务容忍度大小进行实现
  • 修改:进行数据读取
  • 没有:可以进行等待,当节点进行创建的时候进行读取

分布式锁

  • redis实现分布式锁主要基于redis的速度,但是不能开启日志,因此并不是最优选择
  • zookeeper实现分布式锁

抢锁方案:

  1. 心跳请求,有延迟问题
  2. watch 解决了延迟问题,但是同时会回调很多,没有解决压力问题
  3. sequence+watch,监听的时候监听的是前一个

实现

  1. 各自对zk上面某个目录下面进行队列创建然后进行等待
  2. 创建成功以后在回调函数中进行调用查询自己父目录下的兄弟节点(不进行监听)
  3. 获取兄弟节点以后进行排序
  4. 判断自己是会否是第一个
  5. 如果是则使当前线程继续进行,在主线程中对该线程进行锁释放,并且删除前一节点
  6. 如果不是则对自己的前一个的兄弟节点进行监听,在监听的回调事件中对前一节点的删除事件进行行为
举报

相关推荐

0 条评论