业务描述
- 将所有的配置数据配置到zk,其余服务对zk进行watch和get
- zk进行创建连接的时候可以进行目录创建, 创建的目录的配置是进行隔离的。
- 创建zk的时候可以使用countDownLatch.wait进行连接等待,在监听器中进行监听,当连接成功的时候线程继续进行。
- zk读取可以进行同步和异步,异步的有一个回调函数,在回掉函数中进行调用读取数据代码
- 进行异步调用的时候会反复的回调,可以创建工具类xxxCallBack对watch,statCallback,datacallback进行继承,同时实现三个接口,在调用的时候只需要创建一个对象进行传参。
- 在主线程中创建线程的配置引用,传入xxxCallBack中,在获取数据成功的时候进行set,达到数据传输的目的
- 同时 在数据回调的时候进行阻塞,等待数据取回的时候继续进行
数据改变的时候
- 创建:进行数据读取
- 删除:业务容忍度大小进行实现
- 修改:进行数据读取
- 没有:可以进行等待,当节点进行创建的时候进行读取
分布式锁
- redis实现分布式锁主要基于redis的速度,但是不能开启日志,因此并不是最优选择
- zookeeper实现分布式锁
抢锁方案:
- 心跳请求,有延迟问题
- watch 解决了延迟问题,但是同时会回调很多,没有解决压力问题
- sequence+watch,监听的时候监听的是前一个
实现
- 各自对zk上面某个目录下面进行队列创建然后进行等待
- 创建成功以后在回调函数中进行调用查询自己父目录下的兄弟节点(不进行监听)
- 获取兄弟节点以后进行排序
- 判断自己是会否是第一个
- 如果是则使当前线程继续进行,在主线程中对该线程进行锁释放,并且删除前一节点
- 如果不是则对自己的前一个的兄弟节点进行监听,在监听的回调事件中对前一节点的删除事件进行行为