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

121 阅读3分钟

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

分布式定时任务

  • 发展历史
  • 核心架构
  • 课后思考

发展历史

场景:怎么设计抖音春节集卡瓜分20亿技术方案?

业务需求:

  • 定时扫描抖音用户集卡状态
  • 汇总计算用户的瓜分金额
  • 定时开奖

思考:如果简单的通过扫表的方式可以实现上述的需求吗?显然是不可行的,在海量数据的场景,通过扫表的方式无法保障任务的时效性

如何解决上述需求的呢?

目前成熟的方案:

自动化 + 定时执行 + 海量数据 + 高效稳定 = 分布式定时任务

发展历史:

  • Linux命令-CronJob
  • 单机定时任务-Timer、Ticker
  • 单机定时任务-ScheduledExecutorService
  • 任务调度- Quartz
  • 分布式定时任务

分布式定时任务

定时任务是指系统为了自动完成特定任务,实时、延时、周期性完成调度过程

分布式定时任务就是把分散的、可靠性差的定时任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式

执行模式

  • 单机任务
  • 广播任务
  • Map任务
  • MapReduce任务

核心架构

  • 控制台Admin
  • 触发器Trigger
  • 调度器Scheduler
  • 执行器Executor

核心架构:

定时任务架构.png

触发器实现方案:

  • 腾讯字节:轮询扫描
  • Quartz:时间轮

时间轮通常的实现形式:

  • 链表或数组实现时间轮(while-true-sleep): 遍历数组,每个下标放置一个链表,链表节点放置任务,遍历到了就取出执行
  • round型时间轮: 任务上记录一个round,遍历到了就将round减一,为0时取出执行,缺点是需要遍历所有的任务,效率较低
  • 分层时间轮: 使用多个不同的时间维度的轮,比如天轮是记录几点执行,月轮记录几号执行,月轮遍历到了,就把任务取出放到天轮里面,即可实现几号几点执行

课后思考

  1. 分布式定时任务可以帮助我们处理哪些业务场景?

    1. 时间驱动处理场景;整点发送优惠卷,每天更新收益,每天刷新标签数和人群数
    2. 批量处理数据场景;按月批量统计报表数据,批量更新短信状态,实时性要求不高
    3. 异步执行解耦场景;活动状态刷新,异步执行离线查询,与内部逻辑解耦
  2. 春节集卡瓜分20亿的玩法,发奖金额计算、实时开奖两个阶段分别用到分布式定时任务什么执行模式?

    1. 发奖金额计算:mapReduce任务执行模式
    2. 实时开奖:map任务执行模式
  3. 有了分布式定时任务,单机定时任务还有适用场景么?

    1. 从成本来说,预算低的场景下单机延时仍然是首选
    2. 本质上来说,分布式定时任务是单机定时任务的集合
  4. 时间轮这种数据结构,在定时/延时场景相比其他数据结构有哪些优势?

    1. 时间复杂度低
    2. 时间精度高并且精度可拓展
    3. 编写业务逻辑代码更加简便
  5. 分布式定时任务的调度中心怎么判断一台执行器的机器处于可被调度状态?

    1. 通过注册中心心跳检验等
  6. 你能想到哪些业务场景,实时计算引擎优于分布式定时任务?

    1. 日志系统
    2. 交易支付场景