这是我参与「第五届青训营 」伴学笔记创作活动的第 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-job | SchedulerX | TCT | Elastic-job | Saturn | |
|---|---|---|---|---|---|
| 来源公司 | 美团点评 | 阿里巴巴 | 腾讯 | 当当网 | 唯品会 |
| 开源 | 是 | 否 | 否 | 是 | 是 |
| 任务编排 | 子任务依赖 | 支持 | 支持 | 不支持 | 不支持 |
| 任务分片 | 支持 | 支持 | 支持 | 支持 | 支持 |
| 高可用 | 支持 | 支持 | 支持 | 支持 | 支持 |
| 故障转移 | 支持 | 支持 | 支持 | 支持 | 支持 |
| 可视化运维 | 支持 | 支持 | 支持 | 支持 | 支持 |
实现原理
核心架构
核心问题:触发、调度、执行
组件:触发器、调度器、执行器、控制台
功能架构
控制台:元数据存储、元数据状态流转、任务分片、任务依赖、规则引擎。。。
触发器:解析引擎、Scanner、可靠投递、状态流转。。。
调度器:调度、负载均衡、幂等控制、容错、故障转移、限流、计费、优雅启停、状态管控。。。。
执行器:注册、任务获取、任务执行、状态上报、日志处理。。。。。
控制台
任务元数据Job(基础信息、调度时机、执行行为、执行方式)
任务实例JobInstance(Job_id、触发时间、状态和结果、过程信息)
触发器
核心:解析触发规则、在规定时间点触发任务调度
方案:定期扫描+延时消息(腾讯、字节)、时间轮(Quartz)查询和修改的时间复杂度都是O(1)
问题解决:
存储上,不同国别、业务做资源隔离
运行上,不同国别、业务分开执行
部署上,采用多机房七军话部署,避免单点故障、通过数据库锁或者分布式锁保证任务只被触发一次
调度器
核心:资源来源、资源调度、任务执行
任务分片提高任务执行的效率和资源的利用
任务编排:有向无环图
执行器
基于注册中心,可以做到执行器的弹性扩缩容