这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。
本片笔记主要是对青训营课堂的记录,内容是关于分布式定时任务的。在很多的业务场景中,分布式定时任务都是非常重要的一部分,通过这堂课,对分布式定时任务有了初步的了解。
1.为什么需要分布式定时任务
分布式给人带来的直观感受就是计算机的数量增多了,而计算机数量增多说到底就是为了提高整个服务效率,避免单点故障。对于大规模数据的处理,采用分布式使得每台计算机处理的数据不会过于庞大以至于拖垮系统性能。 简单而言,分布式定时任务能够进行平台化管理,分布式部署,支持海量数据。
2.分布式定时任务
定义:定时任务是指系统为了自动完成特定任务,实时,延时,周期性完成任务调度过程。分布式定时任务是把分散的、可靠性差的定时任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。
2.1 核心架构
分布式定时任务有三个关键问题:触发,调度,执行。
触发器的功能主要是生成触发事件,说白了就是决定什么时候开始发生。
调度器的功能主要是分配任务,说白了就是决定谁去做这件事。
执行器的功能就是执行任务,也就是最终干活的部分。
对于分布式定时任务而言,还需要一个控制台,能够让用户方便的管理以及干预待执行任务。
现有的分布式定时框架都是基于上述框架。
2.2 触发器
对于触发器而言,其需要支持大量任务,需要支持秒级的调度,周期任务需要多次执行,需要保证秒级扫描的高性能,避免资源浪费。
2.2.1 定期扫描+延迟消息
触发器由扫描器和处理器组成,扫描器会从DB中扫描出即将执行的任务(比如扫描出10分钟内将要执行的任务),然后交给处理器Processor,处理器会讲这些任务发送给消息队列,并经过延时一定时间后执行,同时处理器会在把消息发送给延时MQ的同时给DB一个信号。当定时时间结束,ME就会把消息发送给调度器,由调度器分配给最终的执行器并向DB反馈任务执行结果。整体的流程就是如上。
2.2.2 时间轮
实践论底层由环形数组实现,数组中的每个元素可以存放一个定时任务列表。
时间轮的查询、修改复杂度都为O(1)。时间轮也是很容易扩展的,采用多级时间轮可以实现秒级,分级,小时级别的定时任务。
2.3 调度器
调度器主要解决资源来源,分配任务。
对于分配,根据功能的不同可以分为随机节点执行,广播执行和分片执行。
调度器同时还负责故障转移。当任务分配给某个执行器时未执行成功,调度器要负责讲任务重新分配给新的调度器,主要根据一致性哈希分配, 一致性哈希能够保证大部分节点不会被影响。
2.4 执行器
执行器的主要功能如上图,主要包括机器注册,调度请求, 日志服务, 回调请求, 状态上报。
3.业务应用
定时、延时、周期性执行任务的业务场景包括电商、互动、游戏等。 在实际业务中,定时任务应用领域是相当广泛的。