欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

集群多机部署时定时任务重复执行问题,本地无问题,因为是单

来源: javaer 分享于  点击 35617 次 点评:216

集群多机部署时定时任务重复执行问题,本地无问题,因为是单


业务场景:

系统中需要使用到定时任务,用了spring的注解@Schedule注解实现。本地无问题,因为是单机。实际部署时是集群部署,有多个服务器,会同时执行定时任务,导致数据重复处理。

解决方案:

方案一 定时任务分离

将系统的定时任务单独抽离为一个项目,与业务后台服务同步在另一个单独的服务器上部署。

方案二 通过ip控制

适用于已知每个服务器的ip且ip不为动态ip,即ip不变。

方案三 利用数据库加锁

在数据库中写入一个变量,利用该变量控制每次只有一个服务器实例能执行该定时任务。比如只有读到变量为1时,才执行任务,并且读到后立马将变量置为0,用程序确保读写时都加锁,读写成功后释放锁。

方案四 redis分布式锁

redis分布式锁的实现
关于redis分布式锁,可以详细看上面的技术文章。主要就是利用redis加锁解锁,从而保证多个实例每次只有一个能执行定时任务,算是方案三的升级版。如果redis也是集群部署,上面的文章也提到了解决方案——redission。

方案五 分布式任务调度框架

关于分布式任务调度框架——定时任务部署在多台服务器时如何避免重复执行,该篇文章的解决方案有较为具体的描述。框架的底层也基于分布式锁和数据库来进行控制和调度。

相关栏目:

用户点评