定时任务重复问题

场景

spring定时任务很简单,方便。 单机的时候没有任务问题,但是集群的时候会出现重复跑的问题。

缺点与影响

集群模式下,如果不加锁,符合条件的数据定时任务都会执行。 这个弊端多多:
1、可能造成数据错乱。(这个就严重了)
2、很多时候为了减轻服务器负荷,重试超过次数,代码就会控制不再执行。多台机器很快就达到重试次数,造成该条数据被冰封。
3、如果是要修改数据,多台机器同时执行非常容易引起死锁。

解决方案

指定ip执行(不推荐)

思路一就是让一台应用执行定时任务,那么就不会重复了。
但是不推荐,原因:
1、如果这台机器挂掉,那任务肯定不执行了。 没有集群的可用性了。
2、需要手动改配置,例如部署到两台机器上,代码相同肯定都跑啊,只跑一台,最少也要改配置文件。如果没有开关,那… 甚至要改代码。

使用redis锁

比较实用的一种方式。
这里有需要注意的问题。

服务挂掉造成锁没有释放掉

例如一台机器,挂掉了,没有执行delete key操作,那么其他机器永远获取不到锁。
解决方案:
加超时时间,到期重新抢占锁。

锁被释放掉,但是任务还没执行完,造成重复执行

这个一定估量定时任务的执行时间。 如果时间比较长,定时任务的触发时间间隔要长些,锁的过期时间不要太频繁。

频繁触发的定时任务如何加锁

猜你喜欢

转载自blog.csdn.net/enthan809882/article/details/106169391
今日推荐