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

94 阅读2分钟

《狂飙》

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

本节导航

  • 发展历史
  • 核心架构

发展历史

  • Linux命令-CronJob

Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。

  • 单机定时任务-Timer、Ticker

Golang 定时器包括:一次性定时器(Timer)和周期性定时器(Ticker)

  • Timer timer创建有两种方式,time.NewTimer(Duration) 和time.After(Duration)。 后者只是对前者的一个包装。 timer到固定时间后会执行一次,请注意是一次,而不是多次。但是可以通过reset来实现每隔固定时间段执行。使用timer定时器,超时后需要重置,才能继续触发。

  • Ticker ticker只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会触发。它会以一个间隔(interval)往通道发送当前时间,而通道的接收者可以以固定的时间间隔从通道中读取时间。

  • 单机定时任务-ScheduledExecutorService

    ScheduledExecutorService是基于线程池的定时任务类,每个调度的任务都会分配到线程池中到一个线程去执行,即任务是并发执行的,互不影响,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是处于轮询任务的状态

  • 任务调度- Quartz

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合,也可以单独使用。

  • 分布式定时任务

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

核心架构

  • 核心架构 image.png

  • 控制台Admin

    • 任务元数据:是用户对任务属性定义,基础信息、调度时机、执行行为、执行方式
    • 任务实例:是一个确定的job的一次运行实例,job_id、触发时间、状态&结果、过程信息
  • 触发器Trigger

    • 核心职责:给定任务,解析触发规则,在规定时间点触发任务的调度

    • 方案:

      • 定期扫描+延时消息(腾讯、字节方案)
      • 时间轮(Quartz)
  • 调度器Scheduler

    • 资源来源
    • 资源调度
    • 任务执行

    方案:

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

    基于注册中心,可以做到执行器的弹性扩缩容