这是我参与「第五届青训营」伴学笔记创作活动的第10天。青训营的第十二次课程中对微服务框架相关知识进行了讲解,下面是我对本次课程内容的一些总结。
分布式定时任务原理
定时任务是指系统实时、延时、周期地完成任务调度的过程,而分布式定时任务则为分散的、可靠性差的定时任务纳入统一的平台,从而高性能、可靠运行、分布式部署的一种管理方式。
分布式定时任务系统主要由三个主要功能组成:
- 触发器(Trigger):生成定时的触发事件;
- 调度器(Scheduler):管理、编排、分配任务;
- 执行器(Executor):执行实际的任务单元,并记录执行信息;
触发器工作原理
触发器需要解析给定任务的触发规则,并在规定的时间点触发任务的调度。在这里,触发器有两种典型的实现方案:
定期扫描+延时执行
- Scanner定期扫描数据库,并扫描出即将需要执行的任务并送往processor;
- processor将任务送入消息队列,使得其延时执行,并同步的修改数据库状态,防止被扫描的任务再次被扫描;
- Scheduler从消息队列获取任务并执行;
时间轮
可以使用时间轮存储任务,每个节点存储同时间需要被执行的任务。该方法可以将触发器查询、修改的复杂度降为O(1)。为了降低时间轮的节点数,还可以设置多级时间轮,例如设置秒级、分级、时级时间轮。
高可用保证
可以设置多个触发器,以避免单个触发器故障时整个定时任务系统不可用。在这里,需要保证多个触发器仅执行一次定时任务,可以使用分布式锁的方式解决该问题。
调度器工作原理
调度器需要将执行器所需执行的任务进行调度,其需要解决以下几个问题:
资源来源
需要确定提供执行任务资源的具体来源:
- 业务系统共享机器资源:优点是执行效率更高;缺点是定时任务脚本容易影响在线服务,且不能由定时任务平台控制扩缩容;
- 独立机器资源:优点是定时任务与业务逻辑相隔离,可以较好的扩缩容;缺点是消耗的资源更多,且独立机器需要与业务系统进行同步。
节点选择
确定任务会被哪一个执行器所执行:
- 随机节点执行:选择一个可用的节点进行调度,性能较低,适用于一些不需要高性能的场景;
- 广播执行:使得所有节点执行任务,适用于批量运维;
- 分片执行:将任务进行拆分,分发到不同节点并行执行。
高级特性
- 任务编排:当定时任务有执行顺序要求时,可以使用有向图的形式对任务进行编排;
- 故障转移:确保部分执行单元执行失败时,任务被继续调度直至完成;
执行器
执行器对任务进行实际的执行,需要实现额外的服务发现,日志服务,状态检测等功能。