分布式定时任务 | 青训营笔记

31 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第8天

定时任务在实际生活中再常见不过了。闹钟,秒杀,红包。。。只不过,我们大多只能接触到单机定时任务。但要承载起亿级用户的应用,问题就变得不那么简单起来。

单机定时任务

在单机中,一般操作系统都自带了定时任务应用,如Linux的CronJob。在我们自己实现的时候,相关的编程语言也一般都有时间类。但在更加复杂的应用场景下,我们可以使用Quartz。

分布式定时任务

分布式定时任务实际上是一个平台。

按触发时机分类:

  • 定时任务:特定时间触发
  • 延时任务:延时触发
  • 周期任务:固定周期触发

执行方式

  • 单机任务:随机一台处理
  • 广播任务:广播到所有机器执行
  • Map任务:一个任务可以分成多个子任务,每个子任务负责一部分的计算。
  • MapReduce任务:可以拆分成多个子任务,并且能够对子任务结果进行汇总的任务。

分布式定时任务实现原理

分布式定时任务核心要解决 触发、调度、执行 三个关键问题。

  • 触发器:Trigger,解析任务,生成触发事件
  • 调度器:Scheduler,分配任务,管理任务生命周期
  • 执行器:Executor,获取执行任务单元,执行任务逻辑

还要提供一个控制台(Admin),提供任务管理和干预的功能。

触发器

  • 任务:Job,任务元数据

    • 任务实例:JobInstance,任务运行的实例
    • 任务结果:JobResult,任务实例运行的结果
    • 任务历史:JobHistory,用户可以修改任务信息,任务实例对应元数据可以不同,所以使用任务历史存储
  • 方案:时间轮

    • 使用环形数据结构,类似于时钟,这样空间和时间复杂度都是常数。
    • 使用多级时间轮来管理时间跨度大的任务

调度器

资源来源:

  • 业务系统提供机器资源
  • 定时任务平台提供机器资源

节点选择:

  • 随机节点执行 适用场景:定时对账
  • 广播执行 适用场景:批量运维
  • 分片执行 适用场景:海量日志统计

任务编排:使用DAG进行可视化任务编排