分布式定时系统 | 青训营笔记

94 阅读3分钟

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

抖音春节活动

分布式定时任务的要求:

自动化、定时执行、海量数据、高效稳定

发展历程

非代码方式

windows批处理:shutdown -s -t 9999.bat

Windows任务计划程序:此电脑->右键管理->计算机管理->任务计划程序(之前用过,后来忘记了)

linux命令-CronJob:分钟 小时 天 月 周 clean_log.sh (系统命令、使用简单、稳定可靠、只能用于单台机器、不兼容其他操作系统)

代码方式

单机定时任务-Timer、Ticker(单任务):可跨平台、仅单机可用

// JAVA 定时任务
psvm {
    Timer timer = new Timer();
    time.schedule(new TimerTask() {
        xxxx
    }, 5000, 5 * 60 * 1000);
}
// Go定时任务
func main() {
    ticker := time.NewTicker(5 * time.Minute)
    for {
        select{
            case <- ticker.C:
                xxxxx
        }
    }
}

单机定时任务-ScheduledExecutorService(多任务):拥有线程池功能、仅单机可用

// JAVA 定时任务
private static ScheduledExecutorService scheduler;
psvm {
    scheduler = Executors.newScheduleThreadPool(5);
    scheduler.scheduleAtFixedRate (((
        new Runnable() {
            xxxx
        })),
        0, 300, TimeUnit.SECONDS)
}

任务调度-Quartz:单任务极致控制、没有负载均衡

分布式定时任务

定时任务:系统为自动完成特定任务,实时、延时、 周期性完成任务调度的过程。

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

优势:平台化管理、分布式部署、支持海量数据

特点:自动化、平台化、分布式、伸缩性、高可用

执行方式:单机任务(随机触发一台机器)、广播任务(所以机器执行)、Map任务(拆分成子任务)、MapReduce任务(实现小任务的汇总)

业内主流定时任务框架

Xxl-jobSchedulerXTCTElastic-jobSaturn
来源公司美团点评阿里巴巴腾讯当当网唯品会
开源
任务编排子任务依赖支持支持不支持不支持
任务分片支持支持支持支持支持
高可用支持支持支持支持支持
故障转移支持支持支持支持支持
可视化运维支持支持支持支持支持

实现原理

核心架构

核心问题:触发、调度、执行

组件:触发器、调度器、执行器、控制台

功能架构

控制台:元数据存储、元数据状态流转、任务分片、任务依赖、规则引擎。。。

触发器:解析引擎、Scanner、可靠投递、状态流转。。。

调度器:调度、负载均衡、幂等控制、容错、故障转移、限流、计费、优雅启停、状态管控。。。。

执行器:注册、任务获取、任务执行、状态上报、日志处理。。。。。

控制台

任务元数据Job(基础信息、调度时机、执行行为、执行方式)

任务实例JobInstance(Job_id、触发时间、状态和结果、过程信息)

触发器

核心:解析触发规则、在规定时间点触发任务调度

方案:定期扫描+延时消息(腾讯、字节)、时间轮(Quartz)查询和修改的时间复杂度都是O(1)

问题解决:

存储上,不同国别、业务做资源隔离

运行上,不同国别、业务分开执行

部署上,采用多机房七军话部署,避免单点故障、通过数据库锁或者分布式锁保证任务只被触发一次

调度器

核心:资源来源、资源调度、任务执行

任务分片提高任务执行的效率和资源的利用

任务编排:有向无环图

执行器

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