Redisson 看门狗机制
何为看门狗
看门狗机制的主要作用是自动续期锁,确保在节点完成任务之前,锁不会过期。具体来说,当一个节点获取到锁后,看门狗会定期检查该锁的过期时间,并在必要时延长锁的过期时间,确保节点可以顺利完成任务。
步骤
- 在获取锁的时候,不能指定leaseTime或者只能将leaseTime设置为-1,这样才能开启看门狗机制。
- 在tryLockInnerAsync方法里尝试获取锁,如果获取锁成功调用scheduleExpirationRenewal执行看门狗机制
- 在scheduleExpirationRenewal中比较重要的方法就是renewExpiration,当线程第一次获取到锁(也就是不是重入的情况),那么就会调用renewExpiration方法开启看门狗机制。
- 在renewExpiration会为当前锁添加一个延迟任务task,这个延迟任务会在10s后执行,执行的任务就是将锁的有效期刷新为30s(这是看门狗机制的默认锁释放时间)
- 并且在任务最后还会继续递归调用renewExpiration。
首先获取到锁(这个锁30s后自动释放),然后对锁设置一个延迟任务(10s后执行),延迟任务给锁的释放时间刷新为30s,并且还为锁再设置一个相同的延迟任务(10s后执行),这样就达到了如果一直不释放锁(程序没有执行完)的话,看门狗机制会每10s将锁的自动释放时间刷新为30s。
startWatchdog方法启动了一个定时任务,每隔10秒检查一次当前持有的锁,并调用checkAndExtendLocks方法延长锁的过期时间。extendLeaseTime方法通过执行Redis脚本来更新锁的过期时间,确保锁在任务完成之前不会过期。
看门狗机制的优缺点
优点:
自动续期:看门狗机制可以自动续期锁,确保任务在完成之前锁不会过期。
可靠性高:通过定期检查锁的状态,看门狗机制可以确保锁的持有状态,从而提高系统的可靠性。
缺点:
资源消耗:看门狗机制需要后台线程定期检查锁的状态,这会消耗一定的系统资源。
复杂性增加:看门狗机制的引入增加了系统的复杂性,可能需要额外的调试和维护工作。
优化
合理设置检查频率:根据任务的执行时间和系统的负载情况,合理设置看门狗线程的检查频率,既保证锁的持有状态,又减少系统资源的消耗。 优化Redis脚本:使用高效的Redis脚本来更新锁的过期时间,减少Redis服务器的负载。 监控和报警:建立完善的监控和报警机制,及时发现和处理看门狗机制中的异常情况,确保系统的稳定性。