这是我参与「第五届青训营」伴学笔记创作活动的第7天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记。
课程概述
本节课程主要分为五个方面:
- 分布式定时任务整体架构
- 控制台Admin详细设计
- 触发器Trigger详细设计
- 调度器Scheduler详细设计
- 执行器Executor详细设计
定时任务的发展
- Linux命令-CronJob
- Timer,Ticker
- 单机定时任务-ScheduledExecutorService
- 任务调度- Quartz
- 分布式定时任务
认识分布式定时任务
核心架构影响因素
- 高可用
- 伸缩性
执行方式
-
单机任务: 随机触发一台机器执行
-
广播任务: 所有机器上执行同一个任务
-
Map任务:一个任务可以分出多个子任务
-
MapReduce任务:先Map出去,再Reduce收回来
分布式定时任务核心架构
-
控制台Admin
-
触发器Trigger
-
调度器Scheduler
-
执行器Executor
触发器的设计
定时扫描+延时消息
- 扫描器扫描DB
- 扫描出的任务通过processer处理
- 如果某些任务还没到执行时间:那么将这些内容放入延迟消息队列
- 其余可执行的在对应时间点执行
- 执行任务后和DB交互
时间轮
单时间轮
每个轮子上的节点代表某个时刻/时段需要执行任务的链表。
这样的设计存在问题
时间粒度如果过粗,链表中的任务不一定都要在某个时间点执行,可能还是需要一个延迟处理的操作,而且找出最小的时间对应的任务需要 O(N) 的时间
- 改进:最小堆?(建堆需要
O(N)的时间,插入元素维护需要O(logN)的时间 - 改进:多级时间轮
多级时间轮
上级时间轮转过对应时间后将任务加到下级去。
(hour-> min -> sec)