ZooKeeper分布式屏障与锁管理
屏障实现任务同步,锁管理处理超时和释放。
双屏障与栅栏
屏障概念:
Java
屏障:等待所有参与者到达后统一执行
用途:多任务同步、批量处理、分布式计算
双屏障模型:
Java
/barrier/ready ← 到达标记节点
/barrier/enter ← 进入屏障节点
/barrier/leave ← 离开屏障节点
双屏障流程:
Java
进入阶段:
1. 每个参与者创建 /barrier/ready/node-N
2. 检查 ready 子节点数量
3. 数量达到 N → 屏障打开
4. 删除自己的 ready 节点
5. 创建 enter 节点,进入屏障
离开阶段:
6. 执行任务
7. 创建 leave 节点
8. 等待所有 leave 节点到达
9. 数量达到 N → 屏障结束
屏障代码:
Java
// 使用Curator DistributedBarrier
DistributedBarrier barrier = new DistributedBarrier(client, "/barrier");
// 设置屏障数量
barrier.setBarrier(5);
// 等待屏障打开
barrier.waitOnBarrier();
// 屏障打开后执行
doTask();
// 离开屏障
barrier.leaveBarrier();
栅栏实现:
text
简单栅栏:
/barrier/node-N
参与者创建节点
监听节点数量变化
数量达到N → 统一执行
屏障与锁区别:
| 对比 | 锁 | 屏障 |
|---|---|---|
| 目的 | 资源互斥 | 任务同步 |
| 状态 | 独占等待 | 同时执行 |
| 释放 | 单个释放 | 全部就绪 |
提示:屏障适合需要所有任务同时开始的场景。
锁超时与释放
锁超时设置:
text
// Curator锁超时
InterProcessMutex lock = new InterProcessMutex(client, "/locks");
// 尝试获取锁,超时10秒
boolean acquired = lock.acquire(10, TimeUnit.SECONDS);
if (!acquired) {
// 获取锁超时,执行备选方案
}
超时返回值:
| 返回 | 说明 |
|---|---|
| true | 成功获取锁 |
| false | 获取锁超时 |
锁释放方式:
| 方式 | 说明 |
|---|---|
| 主动释放 | lock.release() |
| 会话超时 | 临时节点自动删除 |
| 客户端宕机 | 会话断开自动释放 |
主动释放代码:
text
lock.acquire();
try {
// 业务操作
} finally {
lock.release(); // 必须释放
}
自动释放机制:
text
临时节点特性:
客户端会话结束 → 临时节点自动删除
其他监听者收到通知 → 可以获取锁
锁持有时间控制:
text
// 使用try-finally保证释放
try {
lock.acquire(5, TimeUnit.SECONDS);
// 设置业务超时
doTaskWithTimeout(3, TimeUnit.SECONDS);
} finally {
lock.release();
}
锁释放注意事项:
| 注意点 | 说明 |
|---|---|
| 必须释放 | finally块释放 |
| 异常处理 | 异常时也要释放 |
| 超时设置 | 业务超时小于锁超时 |
注意:锁必须在finally块释放,避免死锁。
要点总结
- 屏障等待所有参与者到达后统一执行
- 双屏障有进入和离开两个阶段
- Curator DistributedBarrier简化屏障实现
- 锁超时用acquire(timeout)设置
- 临时节点保证宕机自动释放
- 锁必须在finally块释放
- 业务超时应小于锁超时
📝 发现内容有误?点击此处直接编辑