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

83 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第7天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记。

课程概述

本节课程主要分为五个方面:

  1. 分布式定时任务整体架构
  2. 控制台Admin详细设计
  3. 触发器Trigger详细设计
  4. 调度器Scheduler详细设计
  5. 执行器Executor详细设计

定时任务的发展

  1. Linux命令-CronJob
  2. Timer,Ticker
  3. 单机定时任务-ScheduledExecutorService
  4. 任务调度- Quartz
  5. 分布式定时任务

认识分布式定时任务

核心架构影响因素

  1. 高可用
  2. 伸缩性

执行方式

  1. 单机任务: 随机触发一台机器执行

  2. 广播任务: 所有机器上执行同一个任务

  3. Map任务:一个任务可以分出多个子任务

  4. MapReduce任务:先Map出去,再Reduce收回来

分布式定时任务核心架构

  • 控制台Admin

  • 触发器Trigger

  • 调度器Scheduler

  • 执行器Executor

触发器的设计

定时扫描+延时消息

  1. 扫描器扫描DB
  2. 扫描出的任务通过processer处理
  3. 如果某些任务还没到执行时间:那么将这些内容放入延迟消息队列
  4. 其余可执行的在对应时间点执行
  5. 执行任务后和DB交互

image-20230208233027007.png

时间轮

单时间轮

image-20230208233114407.png

每个轮子上的节点代表某个时刻/时段需要执行任务的链表。

这样的设计存在问题

时间粒度如果过粗,链表中的任务不一定都要在某个时间点执行,可能还是需要一个延迟处理的操作,而且找出最小的时间对应的任务需要 O(N) 的时间

  • 改进:最小堆?(建堆需要 O(N) 的时间,插入元素维护需要 O(logN) 的时间
  • 改进:多级时间轮

多级时间轮

上级时间轮转过对应时间后将任务加到下级去。

(hour-> min -> sec)

image-20230208233730225.png