首页
在线工具
搜索
1
使用Metrics指标度量工具监控Java应用程序性能(Gauges, Counters, Histograms, Meters和 Timers实例)
2
如何将Virtualbox和VMware虚拟机相互转换
3
Jumpserver的MFA配置
4
Kuboard与KubeSphere的区别:Kubernetes管理平台对比
5
Markdown正确使用姿势
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
Search
标签搜索
Angular
Docker
Phabricator
SpringBoot
Java
Chrome
SpringSecurity
SpringCloud
DDD
Git
Mac
K8S
Kubernetes
ESLint
SSH
高并发
Eclipse
Javascript
Vim
Centos
Jonathan
累计撰写
86
篇文章
累计收到
0
条评论
首页
栏目
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
页面
搜索到
1
篇与
的结果
2021-09-06
分布式锁如何自动续期(Watchdog 机制解析)
分布式锁如何自动续期(Watchdog 机制解析) 在分布式系统中,分布式锁广泛应用于防止多个进程同时操作共享资源。其中,基于 Redis 的分布式锁(如 Redisson)提供了一种高效的实现方式。然而,锁的超时管理是一个关键问题:如果业务执行时间较长,锁可能会在任务完成前过期,从而导致多个客户端同时持有锁,造成数据竞争。为了解决这个问题,我们可以使用 Watchdog(看门狗)机制,实现分布式锁的自动续期。 1. 分布式锁的基本流程 以 Redis 为例,分布式锁的获取和释放流程通常如下: 客户端1 发送 SET lock_key unique_id NX PX 30000 请求,尝试获取锁。 Redis 服务器 存储 lock_key,过期时间设定为 30 秒。 客户端1 成功获取锁,开始执行任务。 如果任务在 30 秒内完成,客户端1 发送 DEL lock_key 释放锁。 其他客户端(如 客户端2)在锁释放后才能成功获取锁。 上述流程有一个关键问题:如果 客户端1 任务执行时间超过 30 秒,但还未完成,锁会被 Redis 自动删除,从而导致其他客户端获取锁,出现并发问题。 2. Watchdog 机制的作用 为了解决锁过期的问题,Redisson 等库引入了 Watchdog 机制。Watchdog 的基本原理如下: 客户端1 获取锁后,启动 Watchdog 线程,每隔 lockLeaseTime / 3 秒(例如 10 秒)检查锁是否仍然持有。 如果 客户端1 仍然活跃,则自动向 Redis 发送 PEXPIRE lock_key 30000 请求,延长锁的有效期。 当 客户端1 任务执行完成 时,主动调用 DEL lock_key 释放锁。 如果 客户端1 进程崩溃,Watchdog 不会继续续期,锁会在到期后自动释放。 3. Watchdog 续期的流程示意 根据你的流程图,分布式锁 Watchdog 续期的流程如下: 客户端1 获取锁(SET lock_key unique_id NX PX 30000)。 客户端1 启动 Watchdog 线程,间隔 10 秒检查锁状态。 Watchdog 检查 Redis 是否仍然持有 lock_key。 如果 lock_key 仍然属于 客户端1,执行 PEXPIRE lock_key 30000 延长锁的有效期。 如果 客户端1 任务完成,调用 DEL lock_key 释放锁,Watchdog 线程退出。 如果 客户端1 进程意外终止,Watchdog 失效,锁超时后自动释放。 4. Watchdog 机制的优缺点 优点 自动续期:任务执行时间不确定时,确保锁不会过早释放。 进程故障自动释放:如果进程崩溃,锁在超时后自动释放,避免死锁。 减少人为干预:无需手动计算任务时间,提高系统健壮性。 缺点 需要持久化心跳检测:Watchdog 线程需要定期与 Redis 通信,增加了 Redis 负载。 续期间隔需优化:如果 Watchdog 续期间隔过长,锁可能仍然会过期。 5. 代码示例(基于 Redisson) // 创建 Redisson 客户端 RedissonClient redisson = Redisson.create(); // 获取分布式锁 RLock lock = redisson.getLock("myLock"); boolean locked = lock.tryLock(10, 30, TimeUnit.SECONDS); if (locked) { try { // 执行业务逻辑 System.out.println("业务处理中..."); Thread.sleep(40000); // 模拟业务执行超时 } finally { // 释放锁 lock.unlock(); } } 在 Redisson 中,如果 lock.tryLock() 仅传递 租约时间 lockLeaseTime,则默认会启用 Watchdog 机制,自动续期,直到 unlock() 被调用。 6. 总结 Watchdog 机制通过定期续约,避免 Redis 锁过期导致的并发问题。 适用于执行时间不确定的任务,能够在任务完成前自动续期。 需要权衡 Watchdog 续期频率和 Redis 负载,以优化性能。 如果你的业务场景对分布式锁有较高的可靠性要求,建议使用 Redisson 内置的 Watchdog 机制,而非手动管理锁的生命周期。
2021年09月06日