这是我参与「第五届青训营 」笔记创作活动的第8天
定时任务在实际生活中再常见不过了。闹钟,秒杀,红包。。。只不过,我们大多只能接触到单机定时任务。但要承载起亿级用户的应用,问题就变得不那么简单起来。
单机定时任务
在单机中,一般操作系统都自带了定时任务应用,如Linux的CronJob。在我们自己实现的时候,相关的编程语言也一般都有时间类。但在更加复杂的应用场景下,我们可以使用Quartz。
分布式定时任务
分布式定时任务实际上是一个平台。
按触发时机分类:
- 定时任务:特定时间触发
- 延时任务:延时触发
- 周期任务:固定周期触发
执行方式
- 单机任务:随机一台处理
- 广播任务:广播到所有机器执行
- Map任务:一个任务可以分成多个子任务,每个子任务负责一部分的计算。
- MapReduce任务:可以拆分成多个子任务,并且能够对子任务结果进行汇总的任务。
分布式定时任务实现原理
分布式定时任务核心要解决 触发、调度、执行 三个关键问题。
- 触发器:Trigger,解析任务,生成触发事件
- 调度器:Scheduler,分配任务,管理任务生命周期
- 执行器:Executor,获取执行任务单元,执行任务逻辑
还要提供一个控制台(Admin),提供任务管理和干预的功能。
触发器
-
任务:Job,任务元数据
- 任务实例:JobInstance,任务运行的实例
- 任务结果:JobResult,任务实例运行的结果
- 任务历史:JobHistory,用户可以修改任务信息,任务实例对应元数据可以不同,所以使用任务历史存储
-
方案:时间轮
- 使用环形数据结构,类似于时钟,这样空间和时间复杂度都是常数。
- 使用多级时间轮来管理时间跨度大的任务
调度器
资源来源:
- 业务系统提供机器资源
- 定时任务平台提供机器资源
节点选择:
- 随机节点执行 适用场景:定时对账
- 广播执行 适用场景:批量运维
- 分片执行 适用场景:海量日志统计
任务编排:使用DAG进行可视化任务编排