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

83 阅读2分钟

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

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

零、前言:

记个笔记顺便(恰青豆还是有很多不完善也有可能对的地方还请大佬们指正,前面有两课偏概念我就不发了

一、本堂课重点内容:

  • 前言
  • 发展历程
  • 实现原理
  • 业务应用

二、详细知识点介绍:

10.1 前言

抖音抢红包

2023-02-08-16-26-15-image.png

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);
    }

任务调度

2023-02-08-15-57-31-image.png

但。。。。只能在一台机子上

分布式定时任务

定时任务是指系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程。分布式定时任务是把分散的、可靠性差的定时任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。

触发机制:定时,延时,周期

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

执行方式:

  • 单机任务 -- 计算小
  • 广播任务 -- 执行同一任务
  • map任务 -- 计算量大
  • mapreduce任务 -- 计算量大且汇总

业内框架

2023-02-08-16-08-53-image.png

大部分使用xxl-job

10.3 实现原理

四大组成部分:触发器,调度器,执行器,控制台

1.控制台

job---1:n(执行多次)---jobInstance(任务实例)--1:n(可能会失败要重试)-- JobResult
 |
 |
1:n
 |
 |
JobHistory

jobinstance 是一个确定的job运行实例

2.触发器

设计约束:

  • 支持大量任务
  • 支持秒级调度
  • 周期任务需要多次执行
  • 保证秒级扫描的高性能,避免浪费

方案1

定期扫描+延时消息

发送延时消息给调度器

2023-02-08-16-38-51-image.png

方案2

时间轮

2023-02-08-16-41-01-image.png

链表的查询复杂度是O(n),修改复杂度O(1)

最小堆查询复杂度O(1),修改复杂度O(logn) 不用知道所有元素但是数组长度无法控制

时间轮查询复杂度O(1),修改复杂度O(1)

多级时间轮:可以比作秒表时钟一圈一圈

高可用

存储运行时不同国家不同业务用不同时间轮,多机房,集群部署

数据库行锁

分布式锁

3.调度器

资源来源:业务系统提供机器,定时任务平台提供

节点选择:

  • 随机节点执行:定时对账
  • 广播执行:批量运维
  • 分片执行:海量日志统计

任务分片

2023-02-08-17-03-51-image.png

故障转移

2023-02-08-17-04-18-image.png

4.执行器

2023-02-08-17-04-58-image.png

10.4 业务应用

2023-02-08-17-05-33-image.png