集群多机部署时定时任务重复执行问题

业务场景:

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

解决方案:

方案一 定时任务分离

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

方案二 通过ip控制

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

方案三 利用数据库加锁

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

方案四 redis分布式锁

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

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

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

posted @   摸鱼小天才  阅读(374)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版
点击右上角即可分享
微信分享提示