JAVA架构师之路-教你如何去实现一个分布式定时任务
什么是分布式定时任务:
首先,我们要了解计划任务这个概念,计划任务是指由计划的定时运行或者周期性运行的程序。我们最常见的就是Linux的‘crontab’和Windows的‘计划任务’。
那么什么是分布式定时任务,个人总结为:把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。
为什么要采用分布式定时任务:
单点定时任务的缺点:
功能相对简单,交互性差,任务部署效率低,开发和维护成本比较高,不能很好的满足各系统定时任务的管理和控制,尤其在多系统的环境下更加明显;
许多任务都是单机部署,可用性差;
任务跟踪和告警难以实现。
分布式定时任务的优势:
通过集群的方式进行管理调度,大大降低了开发和维护成本;
分布式部署,保证了系统的高可用性,伸缩性,负载均衡,提高了容错;
可以通过控制台部署和管理定时任务,方便灵活高效;
任务都可以持久化到数据库,避免了宕机和数据丢失带来的隐患,同时有完善的任务失败重做机制和详细的任务跟踪及告警策略。
怎么样设计和实现一个分布式定时任务:
分时方案
严格划分时间片,交替运行计划任务,当主系统宕机后,备用系统仍然工作,但是处理初期被拉长了。
缺点:周期延长了。
untitled.png
HA高可用方案:
正常情况下主系统工作,备用系统守候,心跳检测发现主系统出现故障备用系统启动。
缺点:单一系统,不能做负载均衡,只能垂直扩展,也就是硬件层面的升级,无法做水平扩展。
untitled1.png
多路心跳方案:
采用多路心跳,做服务级,进程级的,IP和端口级别的心跳检测,正常情况是主系统工作,备用系统守候,心跳检测主系统出现故障,备用系统启动,当再次检测到主系统工作,则将执行权交回主系统。
缺点:开发比较复杂,程序健壮性要求高。
任务抢占方案:
A,B两台服务器同时工作,启动需要存在一前一后,谁先启动谁率先加锁,其他服务器只能等待,他们同时对互斥锁进行监控,一旦发现锁被释放,其他服务那个先抢到,那个运行,运行前加排他锁。
优点:可以进一步实现多服务器横向扩展。
缺点:开发复杂,程序健壮性要求高,有时候会出现不释放锁的问题。
任务轮询或任务轮询+抢占排队方案
每个服务器首次启动时加入队列;
每次任务运行首先判断自己是否是当前可运行任务,如果是便运行;
如果不是当前运行的任务,检查自己是否在队列中,如果在,便推出,如果不在队列中,便键入队列。
通过以上这些方案,可以看出3.5的方案才是优先选择的,扩展性好,开发复杂度不是很高。那么这种方案需要的需要的技术原理是什么呢,那就是分布式互斥锁和队列。
原理:
分布式互斥锁:
互斥锁也叫排他锁,用于并发时管理多进程和多进程同一时刻只能有一个进程或者线程操作一个功能。我们将进程,线程中的锁延伸到互联网上,实现对一个节点运行的进程或线程加 锁,解锁操作。这样便能控制节点上的进程或线程的并发。如下图:
有两台服务器运行定时任务,其中serverA的T2做了加锁操作,其他程序必须等它释放锁了才能运行。 那么如果serverA在加锁的过程中,出现宕机怎么办,是否会一直处于别锁状态。那么我们可以在每个锁都设置一个超时阈值,一旦超时便自动解锁。这样就不会因为宕机导致锁一直不被释 放。另外我们还要考虑命名空间的问题,主要是防止出现同名锁,导致被覆盖。
队列:
在上面的基础上,排队运行任务。
从上图中可以看出,TaskQueue中排队情况,运行是自上而下的,当然这个顺序可以自己设置规则,只需要先进先出的远程即可。另外,Task Queue我们需要做至少两个节点,他们遵循主 从结构的原则,主节点需要实时向从节点同步数据,保证在主节点不可用,从节点可以替代。当然,这里可以使用权重轮询的方式,加上数据异步同步,让所有节点都可以做主从的切换, 根据运行状况来分配,可能会更好,但是这样开发难度也有所提高,但是大大增加了高可用性。
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!
合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
如何一起学习,有没有免费资料?
欢迎工作一到五年的 Java 的工程师朋友们加入的 Java 架构开发:770590461
本群提供免费的学习指导架构资料以及免费的解答
不懂得问题都可以在本群提出来之后还会有职业生涯规划以及面试指导