集群服务器定时任务重复执行的解决方案

服务器采用了负载均衡,有两台服务器,部署的代码一样,所以里面的定时任务在某一时间会被同时执行,这就导致了很多其他意外的发生,想要解决的问题基本就三个:单点执行,故障转移,服务状态。这里对比一下网上找的几种方案,:

(1)只在一台服务器上部署该定时任务代码。

优点:解决方法容易理解    缺点:部署麻烦,需要多套代码,且当这台服务器出问题时就没定时任务了。

(2)在定时任务代码上加上某个特定的ip限制,仅某个ip的服务器能运行该定时任务。

优点:解决方法容易理解,部署简单,不需要多套代码。  缺点:同上,只能规定一台服务器运行,发送故障时就没办法了。

(3)利用数据库的共享锁事务管理机制来运行定时任务。

参考博客:https://blog.csdn.net/u012881584/article/details/70194237

原理:在数据库中新建一张表定时任务表,存储了上次执行定时任务的ip地址(ip),任务名称(task_name),是否正在执行(execute)。原博客用代码的方式解释了自己的思路,这里我用文字来总结一下:

集群中的所有服务器都是走以下流程

第一步:查找数据库的定时任务表。

第二步:检查是否有机器在运行定时任务。检查方法:update定时任务表的excute字段为1(1为执行中,0为未执行)、ip为自己的ip,如果update失败,则证明有机器在执行该定时任务,该机器的定时任务就不执行了,成功则进行第三步。

第三步:执行定时任务的具体内容。

第四步:还原excute字段为0。

以上是该方案的流程,利用了mysql的共享锁机制判断,通过是否更新成功来判断是否有机器正在执行定时任务,这种方案可以保证任务只执行一次,且只要集群中有一台服务器是好的,就会执行任务。方案挺好,暂时想不到有啥缺点,可能增加了数据库的负担算一个吧....

(4)利用redis数据库。

参考:https://www.jianshu.com/p/48c5b11b80cd

原理:和第三种差不多,只是通过redis的key-value来存储任务名--执行ip。执行定时任务前先查询redis是否有改任务的值,没有就自己 执行,并插入新的key-vale。有的话就查看ip是否是自己,是的话就执行,不是的话就 证明有其他机器在执行,自己就不执行啦。过期时间可以自己设置,方便有机器出故障时候可以转移机器执行任务。

优点:利用了redis的自动过期机制实现了转移故障机器的问题,比较简单,而且redis的访问速度也很快。

缺点:这里没有事务管理机制,访问redis的时候,一定会出现高并发的情况,所以得自己实现redis的共享锁机制。

(5)利用quartz集群分布式(并发)部署解决方案。

参考:https://www.tuicool.com/articles/B3qeUrB

quartz有很成熟的分布式并发部署定时任务的解决方案了,但是配置比较复杂,且需要新建恨的数据库表,这里就不详细写了(好吧,我也没认真看....)

综上所述,我觉得第三种方案适合小型的项目去做,大的项目最好用quartz去做。

在实现的过程中又发现,同一台服务器上的不同版本之间也会发生cron重复执行的问题,所以不仅考虑不同服务器的问题,还得考虑不同版本之间的问题。

集群服务器定时任务重复执行的解决方案相关推荐

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

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

  2. 多服务环境下定时任务重复执行问题解决方案

    当一个服务部署在多台服务器上时,定时任务可能出现多次执行的情况,就是每个服务上执行一次.有以下两种思路,一是固定死只有某服务器执行定时任务,二是随机暂停几秒,某一服务执行了,其他就不再执行. 1.固定 ...

  3. nc 模拟服务器_NC集群服务器使用详解

    NC 集群服务器使用详解 NC220 发版时,对中间件做了一项重大改进,对集群服务器应用提供了全面解决方案 的支持, 使产品更加能够适应集团企业的大规模应用. 本文力争以通俗的语言, 描述集群服 务器 ...

  4. 集群服务器中定时任务多次执行的解决方案

    1.Oracle 思路:Insert表内容时,主键重复,无法插入 范围:适用于执行频率低的定时任务 方法:新建一张任务执行表,每次执行定时任务之前先insert该表. 比如:每天执行一次批处理操作.主 ...

  5. 集群部署中解决定时任务重复执行的问题-redis分布式锁应用

    背景描述 有小伙伴私信我,关于存在定时任务的项目在集群环境下部署如何解决重复执行的问题,PS:定时任务没有单独拆分. 概述:之前的项目都是单机器部署,所以定时任务不会重复消费,只会执行一次.而在集群环 ...

  6. 集群服务器下使用SpringBoot @Scheduled注解定时任务

    原文:https://blog.csdn.net/huyang1990/article/details/78551578 SpringBoot提供了 Schedule模块完美支持定时任务的执行 在实际 ...

  7. java集群调度_集群环境下定时调度的解决方案之Quartz集群

    集群环境可能出现的问题 在上一篇博客我们介绍了如何在自己的项目中从无到有的添加了Quartz定时调度引擎,其实就是一个Quartz 和Spring的整合过程,很容易实现,但是我们现在企业中项目通常都是 ...

  8. 集群服务器状态命令------rs.status()各个字段的含义

    可根据rs.status() 查询集群服务器状态. 字段解释: self 这个信息出现在执行rs.status()函数的成员信息中 stateStr用户描述服务器状态的字符串.有SECONDARY,P ...

  9. 25000linux集群危机怎么样,我是如何在2小时内组建5000+集群服务器僵尸网络的

    由于Elasticsearch命令执行漏洞,导致上万服务器受影响,截图所有ip无重复.2小时之内顺利在5000多台服务器上执行相关命令. 本次仅是技术测试漏洞影响范围,标题党了.国内测试700台集群服 ...

最新文章

  1. jupyter 代码自动补全_在 Pycharm 中安装及使用 Jupyter (图文详解)
  2. mysql开创_MySQL创始人打造MariaDB 全面兼容MySQL 5.1
  3. skipping incompatible
  4. POJ - 3255 Roadblocks(次短路)
  5. Android Intent的使用
  6. 首次在matable中安装libsvm碰到的问题和解决方法---- mxGetIr 已过时 错误
  7. OpenCV提取图书条码(ISBN码)
  8. C++软件工程师的发展前景如何?
  9. 安装mysql忘记设置密码后如何重设密码
  10. 一个类月光宝盒应用,把手机,电视,盒子变家庭游戏机(FBA,FBNEO,MAME)
  11. 三星980处理器和骁龙855_手机处理器最新排名:麒麟980因一缺陷,不敌高通骁龙855...
  12. P13: * Component组件拆分、子组件向父组件传递数据
  13. html制作菱锥旋转,Flash 3d效果精彩实例:制作旋转的三棱锥
  14. Spring boot Whitelabel Error Page解决方法(弱鸡方法,非全部适用)
  15. 【Qt界面个性化】大杀器——qss
  16. 花十分钟顺手拿个阿里的Apsara Clouder专项技能认证,不比手里的王者香?
  17. JavaScript 生成唯一ID的几种方式
  18. iOS9-by-Tutorials-学习笔记五:Multitasking
  19. hbiulder x 浏览器不显示_教大家HBuilder X怎么配置浏览器的方法
  20. 基于Simulink的电动汽车再生制动仿真建模

热门文章

  1. Android style(样式) 和 theme(主题) 属性
  2. 2. MariaDB激活二进制日志
  3. Qt学习——利用QToolBox实现QQ好友列表
  4. 恶意代码分析实战Lab1
  5. web前端开发技术实验与实践(第三版)储久良编著 项目9 设计饭店菜单价目表
  6. 问题分析工具-鱼骨刺图
  7. 国内著名论坛简写一览(更新中)
  8. 滴答定时器的计数模式_Cortex-M4 Systick滴答定时器
  9. Android恶意软件样本库寻找方式
  10. MTK_HDMI 驱动