Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

  • Spring

  • SpringCloud

  • MySQL

  • Redis

  • 分布式

    • 理论等

      • 分布式锁
      • 从道法术器层面看分布式锁
      • 基于数据库的分布式锁
      • 基于Redis的分布式锁
      • 基于ZooKeeper的分布式锁
      • 从道法术器层面看分布式事务
      • 调用第三方怎么保证事务的四个特性
      • 最终一致和强一致性的区别
      • 本系统扣库存生成计费单,向第三方系统推送计费单,这两个场景分别用什么一致性
      • 单体改微服务,除了分布式锁,除了分布式事务,还要注意哪些问题
    • 分布式算法

    • 分布式事务

    • 分布式锁

    • SpringCloud

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • 分布式
  • 理论等
plantre
2025-05-08

基于ZooKeeper的分布式锁

基于ZooKeeper的分布式锁实现原理与核心机制

1. 核心原理
ZooKeeper通过临时顺序节点(Ephemeral Sequential Nodes)和Watcher监听机制实现分布式锁,具体流程如下:
• 临时节点创建:客户端在锁根节点(如/locks)下创建临时顺序节点(如/locks/lock_00000001),节点名称由ZooKeeper自动生成递增序号。

• 最小序号竞争:客户端检查所有子节点,若自身节点序号最小则获取锁;否则,监听前一个节点的删除事件。

• 锁释放与通知:持有锁的客户端完成任务后删除节点,触发后续节点的Watcher通知,下一个最小序号节点获得锁。

关键特性:
• 强一致性:ZooKeeper的ZAB协议确保所有节点数据视图一致,避免锁状态冲突。

• 自动释放:客户端宕机或断连时,临时节点自动删除,防止死锁。

• 公平性:按节点创建顺序分配锁,避免“插队”现象。


2. 实现步骤

  1. 初始化连接:客户端连接ZooKeeper集群,并确保锁根节点存在。
  2. 创建临时顺序节点:在锁根节点下创建临时顺序节点,例如/locks/lock_00000001。
  3. 获取子节点并排序:获取所有子节点列表,按序号升序排列。
  4. 判断锁归属:若当前节点为最小序号,则获取锁;否则监听前一个节点的删除事件。
  5. 业务处理与释放锁:执行业务逻辑后删除自身节点,触发后续客户端的锁竞争。

代码封装(Apache Curator示例):

InterProcessMutex lock = new InterProcessMutex(client, "/locks/order");  
if (lock.acquire(3, TimeUnit.SECONDS)) {  
    try {  
        // 执行业务逻辑  
    } finally {  
        lock.release();  
    }  
}  
1
2
3
4
5
6
7
8

Curator封装了节点创建、Watcher注册和异常处理,支持可重入锁和超时机制。


3. 优缺点分析
优势:
• 高可靠性:ZooKeeper集群的高可用性(多副本容错)和强一致性保障锁的稳定性。

• 自动容错:临时节点自动清理,防止客户端宕机导致的死锁。

• 公平锁支持:顺序节点确保先请求者优先获取锁,适合对公平性敏感的场景(如金融交易)。

劣势:
• 性能瓶颈:频繁的节点创建、删除和Watcher通知导致较高的网络开销,单节点QPS约5k,低于Redis。

• 实现复杂度:需处理节点监听、重试逻辑和异常场景(如网络抖动),开发成本较高。

• 依赖性强:强依赖ZooKeeper集群稳定性,需额外运维成本。


4. 适用场景
• 金融核心交易:需严格强一致性和顺序性,如转账、订单状态变更。

• 分布式任务调度:防止多节点重复执行定时任务(如数据备份)。

• 全局资源分配:如唯一流水号生成、分布式配置更新。

• 长流程事务:如订单履约流程,需跨服务协调且容忍一定延迟。


5. 优化与注意事项
• 锁粒度控制:根据业务拆分细粒度锁(如按商品ID分锁),减少竞争。

• 超时与续租:设置锁超时时间(默认30秒),结合心跳机制定期续租,避免业务未完成锁提前释放。

• 避免“惊群效应”:仅监听前一个节点,而非所有节点,减少无效通知。

• 监控与运维:监控ZooKeeper集群性能(如节点数、会话超时率),优化网络配置降低延迟。


6. 与其他方案的对比

对比维度 ZooKeeper Redis
一致性 强一致(CP) 最终一致(AP)
性能 低(约5k QPS) 高(10万+ QPS)
容错性 自动释放,防死锁 依赖超时机制,存在锁误删风险
适用场景 金融、长事务、强一致场景 高频短事务(如秒杀)

总结
基于ZooKeeper的分布式锁适用于强一致性、长流程、高可靠场景,但其性能局限性和复杂度需通过合理设计(如Curator封装、锁粒度优化)弥补。在选型时,需结合业务对一致性、性能和运维成本的需求综合权衡。

编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05
基于Redis的分布式锁
从道法术器层面看分布式事务

← 基于Redis的分布式锁 从道法术器层面看分布式事务→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式