page contents

定时任务与分布式锁

Pack 发布于 2020-02-07 18:41
阅读 805
收藏 0
分类:分布式

应用程序两个副本,程序中有几个定时任务,他们的间隔时间都是不同的,现在,我只需要一台副本上执行定时任务,该如何做到。比如A任务单机时,两小时执行一次,现在两个副本 A任务还是两小时执行一次。

我的想法:
redis 分布式锁,以A任务为例,定时任务间隔1小时:

boolean flag = stringRedisTemplate.opsForValue.setIfAbsent(key,value, 1, TimeUnit.HOUR);
if(!flag) {
return;
}
…// 执行任务

思路是:执行完任务后,不解锁,等锁经过间隔时间后过期。

缺陷:

  1. 任务的执行时间,假设为10分钟, 那么锁会在下次任务执行前10分钟过期,如果在此10分钟内,另一个副本由于故障重启,那么另一个副本将会获得锁进而可以执行任务。 任务的执行时间越长,影响越大。

2.在开发阶段,都会频繁的重启程序,还是以A为例 ,一个小时内只有第一次运行时会获得锁,之后重启的话获取锁失败不会执行定时任务,不利于调试。

各位大神有什么好的思路来解决这个问题吗,谢谢!

266
Pack
Pack

解决思路:

  1. 针对第一个问题,任务的执行过后在重置Redis 分布式锁的过期时间
  2. 针对第二个问题,通过profile去实现,dev profile的时候不走Redis 分布式锁的逻辑
请先 登录 后评论