这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记。
分布式定时任务学习总结
一.什么是定时任务?
定时任务是指系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程。
譬如:
- Windows批处理-自动关机
创建.bat文件,文件内容
shutdown -s -t 600,双击运行10分钟后自动关机。 - 使用Linux命令-CroNJob
设置每天2.30清理机器日志
30 2 * * * clean_log.sh(前五位分别设置是分、小时、每月哪天、月、每周哪天) - 单机定时任务-Timer、Ticker
- 单机定时任务-ScheduledExecutorService
- 任务调度框架-Quartz Quartz是开源且具有丰富特性的任务调度库,做到了单任务极致控制,但是没有负载均衡机制
二.什么是分布式定时任务?
而分布式定时任务是把分散的、可靠性差的定时任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。特点:自动化、平台化、分布式、伸缩性、高可用。
执行方式:
- 单机任务:随机触发一台机器执行任务。实际与单机定时任务差不多。
- 广播任务:广播到所有机器上执行同一个任务。多机器执行同一个任务,多用户的定时任务还是无法处理。
- Map任务:一个任务可以分出多个子任务,每个子任务负责一部分的计算。适用于计算量大,单机无法满足要求的任务。
- MapReduce任务:在Map任务的基础上,还可以对子任务的结果做汇总计算。 一些业内优秀定时任务框架:Xxl-job、SchedulerX、TCT、Elastic-job、Saturn
三.分布式定时任务原理
分布式定时任务主要解决触发、调度、执行三个关键问题。
核心架构:
在用户创建任务后,上交给控制台,当任务触发器触发时,通过调度器选择合理的执行器,最后任务分派到执行器上真正执行。
- 控制台(Admin):提供任务管理和干预的功能。
- 触发器(Trigger):解析任务,生成触发事件。
- 调度器(Scheduler):分配任务,管理任务生命周期。
- 执行器(Executor):获取执行任务单元,执行任务逻辑。
控制台
在接收到任务元数据(Job)的基础信息、调度时机、执行行为、执行方式后,创建Job的运行实例,然后记录录实例的状态、结果等信息,以便于出现问题时消息的追回等。
触发器
对于给定的任务,解析触发规则,在规定的时间触发任务的调度。
- 定期扫描+延时消息 每隔一段时间扫描最近即将执行的任务加入到触发器,加入到延时消息队列,一旦到达任务运行的时间,调度器就会执行任务。
- 时间轮 时间轮是一种高效来利用线程资源来进行批量化调度的一种调度模型。它是一个存储环形队列,数组中的每个元素可以存放一个定时任务列表。把大批量的调度任务全部都绑定到同一个的调度器上面,使用这一个调度器来进行所有任务的管理(manager),触发(trigger)以及运行(runnable)。能够高效的管理各种延时任务,周期任务,通知任务等等。
高可用:为避免单点故障使用Trigger集群模式。同时采用分布式锁模式,在触发调度之前,尝试抢占分布式锁,使用Redis锁或Zookeeper锁,抢锁成功则触发调度。
调度器
资源调度-节点选择
随机节点执行:选择集群中一个可用的执行节点执行调度任务。适用场景:定时对账。
广播执行:在集群中所有的执行节点分发调度任务并执行。适用场景:批量运维。
分片执行:按照用户自定义分片逻辑进行拆分 ,分发到集群中不同节点并行执行,提升资源利用效率。适用场景.海量日志统计。
资源调度-任务分片
通过任务分片来提高任务执行的效率和资源的利用率。将任务分为多个Map任务分发到多个执行器上执行,业务数据也同样分区段分发到执行器上
执行器
执行器机器进行注册之后才能够让调度器进行调用。因此基于调度中心,可以做到执行器的弹性扩缩容
四.总结
分布式定时任务应用场景:所有需要定时、延时、周期性执行任务的业务场景,例如订单自动关闭、集卡集福活动、各种虚拟物品发放。相比于其他解决方案无明显缺点,时效性达到秒级,可控性和简洁性都很高。同时还有实时计算也是个不错的解决方案,但是仅能做数据处理。