服务器集群控制仅有一台服务器执行任务
2018-04-03 15:45
555 查看
定时任务(批处理任务)设计不合理的反面教材:
曾经使用Spring Batch批处理框架的Tasklet进行批处理任务,使用Redis锁进行并发控制,在任务开始前使用Redis的setnx命令往Redis中插入值,任务结束后删除值,任务只有在当前Redis中不存在值时才运行启动。
设计不合理之处:
存在单点故障问题,一台机器A开始处理任务时,其他机器不处理任务,当服务器A在批处理任务执行到一半时宕机,Redis中的值需要等待自动过期才可删除,因此在Redis值自动过期前,此批处理任务不会再次启动。
服务器集群中,定时任务(批处理任务)设计需要解决的问题:
1、如果集群中每台机器都启动定时任务,容易造成数据重复处理的问题。
2、如果采用定时任务开关的方式,只一台机器的开关on,其他机器的开关off,可以避免数据重复处理的问题,但是存在单点故障的问题。
解决方式有:
1、任务从数据库中读,保证只有一台机器可以抢到任务。
2、将任务的定时触发模块、任务的执行模块分离。任务的定时触发模块每台机器都允许触发任务,但是任务的执行模块,只要收到一个执行任务,那么下一个执行任务就被忽略掉。任务开始执行设置running = true,任务执行完毕设置running = false,当running为ture时候,下一个任务不允许执行。需要注意的是,一定要在finally中加上running = false,要不然任务异常的话,下一次任务永远不会再执行了。
曾经使用Spring Batch批处理框架的Tasklet进行批处理任务,使用Redis锁进行并发控制,在任务开始前使用Redis的setnx命令往Redis中插入值,任务结束后删除值,任务只有在当前Redis中不存在值时才运行启动。
设计不合理之处:
存在单点故障问题,一台机器A开始处理任务时,其他机器不处理任务,当服务器A在批处理任务执行到一半时宕机,Redis中的值需要等待自动过期才可删除,因此在Redis值自动过期前,此批处理任务不会再次启动。
服务器集群中,定时任务(批处理任务)设计需要解决的问题:
1、如果集群中每台机器都启动定时任务,容易造成数据重复处理的问题。
2、如果采用定时任务开关的方式,只一台机器的开关on,其他机器的开关off,可以避免数据重复处理的问题,但是存在单点故障的问题。
解决方式有:
1、任务从数据库中读,保证只有一台机器可以抢到任务。
2、将任务的定时触发模块、任务的执行模块分离。任务的定时触发模块每台机器都允许触发任务,但是任务的执行模块,只要收到一个执行任务,那么下一个执行任务就被忽略掉。任务开始执行设置running = true,任务执行完毕设置running = false,当running为ture时候,下一个任务不允许执行。需要注意的是,一定要在finally中加上running = false,要不然任务异常的话,下一次任务永远不会再执行了。
相关文章推荐
- 使用redis实现分布式锁(在集群环境下让任务排队执行)
- 在CI (Jenkins) 从机(服务器)上使用bat批处理执行自动构建任务时,输出NuGet还原失败的解决方案
- Kettle 集群(cluster)在多个服务器(windows、linux)上并发执行
- 使用 ajax+php system函数,控制 linux执行 ls 命令,显示linux服务器上的文件
- hadoop中的一次集群任务执行超时问题查找过程
- 集群环境下控制定时钟执行的一种方法
- JavaScript流程控制,关键是如何实现任务的顺序执行。
- Linux下使用Shell命令控制任务Jobs执行
- Linux下使用Shell命令控制任务Jobs执行(转)
- 解决 集群 环境 定时任务 重复执行 的问题
- Ubuntu12.04下同一台服务器Apache | Tomcat | 实现集群负载均衡
- crontab -让服务器执行定时任务
- 定时任务在服务器集群中的实现问题
- 基于任务复制的异构集群并行程序的执行
- crontab 执行定时任务如何控制前一个任务执行完后再启动下一个任务?
- 完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题
- hadoop中的一次集群任务执行超时问题查找过程
- http服务器单进程执行任务
- quartz做集群配置较短的时间间隔会重复执行任务的问题