说明
本篇文章存在的主要意义就是帮助我加深记忆顺利拿offer的,只符合我的阅读习惯,如有朋友搜到,仅做参考。
1. ZK的数据模型:节点的特性与应用
1.1 节点的类型
zookeeper维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统,且只能以绝对路径访问,包括以下三种类型。
临时:随着客户端会话的断开而断开
持久:不会随着创建的客户端的断开而删除,除非显式的调用delete
有序:在节点上加上了序号,可以清晰的看到节点的创建顺序
1.2 节点的状态结构
利用命令“stat 节点”查看,节点包含的信息如下所示
1.3 zk实现的锁
** 悲观锁:通过创建一个节点的lock来实现,坏处就是会锁住这个资源,效率低下
** 乐观锁:通过节点的版本号实现,利用CAS原理去更新节点的信息
2. 发布订阅模式:如何使用watch机制实现分布式通知
2.1 ZK机制的实现
通过向ZK客户端构造函数传递Watch实现
还可以通过getData、exists、getChildren实现
2.2 客户端Watch 注册实现过程
标记该会话是一个带有 Watch 事件的请求
将 Watch 事件存储到 ZKWatchManager
2.3服务端 Watch 注册实现过程
解析收到的请求是否带有 Watch 注册事件
将对应的 Watch 事件存储到 WatchManager
2.4 服务端Watch时间的触发过程
会调用WatchManager.triggerWatch方法触发事件变更,并删除watch triggerWatch 函数内部,封装了一个具有会话状态、事件类型、数据节点 3 种属性的 WatchedEvent 对象。之后查询该节点注册的 Watch 事件,如果为空说明该节点没有注册过 Watch 事件。如果存在 Watch 事件则添加到定义的 Wathcers 集合中,并在 WatchManager 管理中删除。最后,通过调用 process 方法向客户端发送通知。
2.5 客户端回调的过程
通过SendThread.readResponse() 方法来统一处理服务端的相应,处理完后并删除watch
所以综上所述,watch具有一次性,如果要继续对某一个节点进行继续监听,需要在客户端的回调中,重新创建监听
3. ACL权限控制:如何避免未经授权的访问
一个 ACL 权限设置通常可以分为 3 部分,分别是:权限模式(Scheme)、授权对象(ID)、权限信息(Permission)。最终组成一条例如“scheme