分布式环境下定时任务重复执行问题解决方案

现在为了提高服务的响应时间,避免单点故障,一般项目都会做集群部署,最少两个节点。集群部署的时候就会暴露出一些单节点下不会遇到的问题,比如session问题、缓存不一致问题等。还有一种情况是,定时任务重复执行的问题。

对于分布式环境下定时任务重复执行问题,常见的几种解决方案有下面这几种。

一、分布式锁

分布式锁是最常用的一种方式,需要对定时逻辑加上一些判断,防止在同一时间重复执行。分布式锁常见的有三种:数据库唯一索引、redis分布式锁、zookeeper分布式锁。

数据库唯一索引,比较好理解:就是在定时表里面加一个添加了唯一索引的字段,一个任务执行前先更新锁定这个字段,然后再执行定时任务,执行完成后,更新释放这个字段。

redis分布式锁,是通过setnx来实现的,和数据的过程差不多:更新前先查询有没有,没有的话锁定后执行定时任务,执行完成后释放锁。优点是内存数据库比传统数据库更快,不需要改数据库,代码改动相对较小,推荐。

二、定时任务单节点执行

单节点执行就是把项目中的定时任务逻辑都单独拎出来作为一个单独的微服务来执行,并且不做集群,单节点执行。这样就避免了集群重复执行的问题,优点是简单直接,不是很重要的定时任务可以选择此方法。缺点很明显:单节点故障。

三、Quartz集群

如果是使用的quartz框架的话,也可以考虑quartz本身提供的集群功能,搭建集群环境下的定时任务。缺点,quartz的集群实现比较复杂,需要额外的11张配置表。但是如果场景需要或者想做个公司内部通用的服务的话,可以考虑搭建一个定时任务集群的话也是可以考虑的,可以单出拎出来作为一个定时任务中心来使用。

发布了125 篇原创文章 · 获赞 116 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shipfei_csdn/article/details/103726950