每日五道java面试题之ZooKeeper篇(二)

目录:

  • [第一题. 客户端注册 Watcher 实现](#第一题. 客户端注册 Watcher 实现)
  • [第二题. 服务端处理 Watcher 实现](#第二题. 服务端处理 Watcher 实现)
  • [第三题. ACL 权限控制机制](#第三题. ACL 权限控制机制)
  • [第四题. Chroot 特性](#第四题. Chroot 特性)
  • [第五题. 客户端回调 Watcher](#第五题. 客户端回调 Watcher)

第一题. 客户端注册 Watcher 实现

(1)调用 getData()/getChildren()/exist()三个 API,传入 Watcher 对象

(2)标记请求 request,封装 Watcher 到 WatchRegistration

(3)封装成 Packet 对象,发服务端发送 request

(4)收到服务端响应后,将 Watcher 注册到 ZKWatcherManager 中进行管理

(5)请求返回,完成注册。

第二题. 服务端处理 Watcher 实现

(1)服务端接收 Watcher 并存储

接收到客户端请求,处理请求判断是否需要注册 Watcher,需要的话将数据节点的节点路径和 ServerCnxn(ServerCnxn 代表一个客户端和服务端的连接,实现了 Watcher 的 process 接口,此时可以看成一个 Watcher 对象)存储在WatcherManager 的 WatchTable 和 watch2Paths 中去。

(2)Watcher 触发

以服务端接收到 setData() 事务请求触发 NodeDataChanged 事件为例:

2.1 封装 WatchedEvent

将通知状态(SyncConnected)、事件类型(NodeDataChanged)以及节点路径封装成一个 WatchedEvent 对象

2.2 查询 Watcher

从 WatchTable 中根据节点路径查找 Watcher

2.3 没找到;说明没有客户端在该数据节点上注册过 Watcher

2.4 找到;提取并从 WatchTable 和 Watch2Paths 中删除对应 Watcher(从这里可以看出 Watcher 在服务端是一次性的,触发一次就失效了)

(3)调用 process 方法来触发 Watcher

这里 process 主要就是通过 ServerCnxn 对应的 TCP 连接发送 Watcher 事件

通知。

第三题. ACL 权限控制机制

UGO (User/Group/Others)

目前在 Linux/Unix 文件系统中使用,也是使用最广泛的权限控制方式。是一种粗粒度的文件系统权限控制模式。
ACL (Access Control List)

访问控制列表包括三个方面:

权限模式(Scheme)

(1)IP:从 IP 地址粒度进行权限控制

(2)Digest:最常用,用类似于 username:password 的权限标识来进行权限配置,便于区分不同应用来进行权限控制

(3)World:最开放的权限控制方式,是一种特殊的 digest 模式,只有一个权限标识"world:anyone"

(4)Super:超级用户

授权对象授权对象指的是权限赋予的用户或一个指定实体,例如 IP 地址或是机器灯。权限 Permission

(1)CREATE:数据节点创建权限,允许授权对象在该 Znode 下创建子节点

(2)DELETE:子节点删除权限,允许授权对象删除该数据节点的子节点

(3)READ:数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等

(4)WRITE:数据节点更新权限,允许授权对象对该数据节点进行更新操作

(5)ADMIN:数据节点管理权限,允许授权对象对该数据节点进行 ACL 相关设置操作

第四题. Chroot 特性

3.2.0 版本后,添加了 Chroot 特性,该特性允许每个客户端为自己设置一个命名空间。如果一个客户端设置了 Chroot,那么该客户端对服务器的任何操作,都将会被限制在其自己的命名空间下。

通过设置 Chroot,能够将一个客户端应用于 Zookeeper 服务端的一颗子树相对应,在那些多个应用公用一个 Zookeeper 进群的场景下,对实现不同应用间的相互隔离非常有帮助。

第五题. 客户端回调 Watcher

客户端 SendThread 线程接收事件通知,交由 EventThread 线程回调Watcher。

客户端的 Watcher 机制同样是一次性的,一旦被触发后,该 Watcher 就失效了。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力

相关推荐
77qqqiqi3 分钟前
解决Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required报错问题
java·数据库·微服务·mybatis·mybatisplus
weisian1517 分钟前
Java WEB技术-序列化和反序列化认识(SpringBoot的Jackson序列化行为?如何打破序列化过程的驼峰规则?如何解决学序列化循环引用问题?)
java·spring boot
橘子编程20 分钟前
SpringMVC核心原理与实战指南
java·spring boot·spring·tomcat·mybatis
踏上青云路1 小时前
C# 闭包
java·前端·c#
倒悬于世1 小时前
ThreadLocal详解
java·开发语言·jvm
myjs9991 小时前
数学=符号
java·前端·算法
程序猿小D1 小时前
Java项目:基于SSM框架实现的校园活动资讯网管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
java·数据库·mysql·spring·毕业设计·ssm框架·校园活动
阿华的代码王国2 小时前
【Android】PopupWindow实现长按菜单
android·xml·java·前端·后端
找不到、了2 小时前
关于MyBatis 的懒加载(Lazy Loading)机制
java·mybatis
啃火龙果的兔子2 小时前
快速搭建Java服务指南
java·开发语言