ZooKeeper 典型应用场景
候选人小李在面试阿里 P6 时,面试官问:"ZooKeeper 在你们项目里是怎么用的?用过分布式锁吗?"
小李说:"用过,用 ZooKeeper 的临时节点做的。"面试官追问:"那怎么保证锁的公平性?如果获取锁的节点崩溃了会怎样?"
小李:"..."
【面试官心理】 ZooKeeper 的典型应用场景是考察候选人实战经验的关键问题。能说清楚分布式锁的实现原理(临时顺序节点 + Watch)、Master 选举、配置管理的候选人,说明他有生产环境的使用经验。这种候选人在我这里是 P6+ 的水平。
一、Master 选举 🔴
1.1 场景描述
多台服务器竞争一个 Master 角色,只有 Master 能执行关键操作(如数据同步、任务分发)。
1.2 实现原理
核心思想:用临时节点 + Watch,谁先创建节点谁就是 Master。
1.3 代码实现
1.4 ❌ 错误示范
候选人原话:"Master 选举用临时节点就行,临时节点挂了自动删除。"
问题诊断:
- 没有提到 Watch 机制,轮询效率低下
- 没有处理竞态条件(多个节点同时抢主)
- 没有说明如何判断当前节点是否是 Master
【面试官心理】 Master 选举的细节在于"临时节点 + Watch"的组合使用。单用临时节点会导致轮询,效率低下;加上 Watch 才能实现高效的通知机制。
二、分布式锁 🟡
2.1 分布式锁的要求
2.2 非公平锁实现
2.3 公平锁 vs 非公平锁
公平锁的实现:
2.4 羊群效应问题
问题:大量客户端同时抢一把锁时,如果用监听最小节点,会产生"羊群效应":
解决方案:改用监听前一个节点,形成锁队列:
三、服务注册与发现 🟡
3.1 核心原理
3.2 Provider 注册
3.3 Consumer 订阅
3.4 节点变化感知
四、配置管理 🟡
4.1 动态配置管理
4.2 配置变更的完整链路
五、分布式队列 🟢
5.1 FIFO 队列
5.2 阻塞队列
六、ID 生成器 🟢
6.1 基于顺序节点的 ID 生成
七、Watch 回调的线程模型 🟢
7.1 Watch 在哪个线程执行
ZooKeeper 的 Watch 回调在客户端的 EventThread 中执行:
7.2 常见坑
八、生产避坑
8.1 常见翻车点
- 羊群效应:大量 Watch 监听同一个节点,导致通知风暴
- Watch 漏注册:收到通知后忘记重新注册
- Session 超时配置不当:超时太短导致误判节点下线
- ZNode 数据过大:最大 1MB,超过会失败
- 临时节点不能创建子节点:这是 ZooKeeper 的限制
8.2 Curator 框架
生产环境推荐使用 Curator,它封装了 ZooKeeper 的复杂操作:
Curator 是 Netflix 开源的 ZooKeeper 客户端封装,生产环境强烈推荐使用。它解决了原生 ZooKeeper 客户端的很多坑:自动重连、Watch 重新注册、分布式锁的公平性等。
ZooKeeper 的临时节点和 Session 绑定,如果 Session 超时(比如网络抖动),临时节点会被删除。如果你的服务需要临时节点来做健康检查,记得把 Session 超时配置得合理一些,避免误判。
【面试官心理】 ZooKeeper 的典型应用场景是考察候选人实战经验的关键。能说清楚分布式锁的临时顺序节点实现、羊群效应的解决、Master 选举的 Watch 机制的候选人,说明他有生产环境的使用经验。这种候选人在我这里是 P6+ 的水平。