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

46 阅读1分钟

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

分布式定时任务的发展流程

Windows批处理

image.png

Linux CronJob

image.png

Timer和Ticker

在Go语言中,Timer是一次性定时器。Ticker是周期性定时器。

// 延迟5s中,打印一个hello world
func DelayFunction() {
    timer := time.NewTimer(5 * time.Second)
    select {
        case <- timer.C:
            log.Println("hello World")
    }
}

// 周期性的每隔5s打印一个hello world
func TickerFunction() {
    ticker := time.NewTicker(5 * time.Second)
    defer ticker.Stop()
    for range ticker.C {
        log.Println("hello World")
    }
}

for range ticker.C会持续的从管道中获取事件,收到事件后打印一行日志。

任务调度 Quartz

image.png

分布式定时任务

image.png

特点:

image.png

执行方式:

image.png

image.png

实现原理

整体架构

image.png

触发:什么时间点触发

调度:怎么协调机器进行调度

执行:单台机器怎么执行好任务

image.png

image.png

image.png

数据流

image.png

功能架构

image.png

控制台

image.png

一个任务可能被执行多次,每次执行会生成一个不同的任务实例。

image.png

触发器

image.png

方案1:

image.png

方案2:

image.png

image.png

image.png

image.png

轮的刻度不够,可以加一个count,表示转几圈之后,执行任务

image.png

image.png

触发器的高可用问题

image.png

数据库行锁模式

image.png

分布式锁模式

image.png

调度器

资源来源

image.png

资源调度

节点选择

image.png

任务分片

image.png

任务编排

image.png

故障转移

image.png

执行器

image.png

业务应用

image.png

其他解决方案

image.png