[ 分布式定时任务 | 青训营笔记 ]
这是我参与「第五届青训营」伴学笔记创作活动的第 10 天
零、前言:
记个笔记顺便(恰青豆还是有很多不完善也有可能对的地方还请大佬们指正,前面有两课偏概念我就不发了
一、本堂课重点内容:
- 前言
- 发展历程
- 实现原理
- 业务应用
二、详细知识点介绍:
10.1 前言
抖音抢红包
10.2 发展历程
定时任务
每天 2:30 定时清理机器日志
30 2 *** clean_log.sh
每隔五分钟定时刷新本地缓存数据
func main(){
ticker := time.NewTicker(5 * time.Minute)
for{
select {
case <- ticker.C:
SvncLcoalCahe()
}
}
}
每隔五分钟执行多个任务
private static ScheduledExecutorService scheduler;
public static void main(string[] args)throws Exception{
scheduler = Executors.newScheduledThreaPool(5);
scheduler.scheduleAtFixesRate(((
new Runnable(){
@Override
public void run(){
ToDo();
}
})),
0,300,
TimeUnit.SECONDS);
}
任务调度
但。。。。只能在一台机子上
分布式定时任务
定时任务是指系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程。分布式定时任务是把分散的、可靠性差的定时任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。
触发机制:定时,延时,周期
分布式特点:自动化,平台化,分布式,伸缩性,高可用
执行方式:
- 单机任务 -- 计算小
- 广播任务 -- 执行同一任务
- map任务 -- 计算量大
- mapreduce任务 -- 计算量大且汇总
业内框架
大部分使用xxl-job
10.3 实现原理
四大组成部分:触发器,调度器,执行器,控制台
1.控制台
job---1:n(执行多次)---jobInstance(任务实例)--1:n(可能会失败要重试)-- JobResult
|
|
1:n
|
|
JobHistory
jobinstance 是一个确定的job运行实例
2.触发器
设计约束:
- 支持大量任务
- 支持秒级调度
- 周期任务需要多次执行
- 保证秒级扫描的高性能,避免浪费
方案1
定期扫描+延时消息
发送延时消息给调度器
方案2
时间轮
链表的查询复杂度是O(n),修改复杂度O(1)
最小堆查询复杂度O(1),修改复杂度O(logn) 不用知道所有元素但是数组长度无法控制
时间轮查询复杂度O(1),修改复杂度O(1)
多级时间轮:可以比作秒表时钟一圈一圈
高可用
存储运行时不同国家不同业务用不同时间轮,多机房,集群部署
数据库行锁
分布式锁
3.调度器
资源来源:业务系统提供机器,定时任务平台提供
节点选择:
- 随机节点执行:定时对账
- 广播执行:批量运维
- 分片执行:海量日志统计
任务分片
故障转移
4.执行器