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

114 阅读1分钟

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

前言

主要是预习一下明天的课程,顺便写一下自己之前了解的东西,代码有一些不是用go语言

课程概述

本节课程主要分为五个方面:

  1. 分布式定时任务整体架构
  2. 控制台Admin详细设计
  3. 触发器Trigger详细设计
  4. 调度器Scheduler详细设计
  5. 执行器Executor详细设计

课前

分布式定时任务发展历史

  • Linux命令-CronJob
  • 单机定时任务-Timer、Ticker
  • 单机定时任务-ScheduledExecutorService
  • 任务调度- Quartz
  • 分布式定时任务

1. Linux命令-CronJob

Cron:  Cron来自chron,它是希腊语“ time”的前缀。Cron是在系统启动时运行的守护程序。

Crontab:  Crontab(CRON TABle)是一个文件,其中包含要在指定时间运行的cron条目的时间表。文件位置因操作系统而异。

cron是工具的名称,crontab通常是列出cron将要执行的作业的文件,而这些工作是令人惊讶的惊喜cronjob

2.单机定时任务-Timer、Ticker

例:每隔5min定时刷新本地缓存数据

func main(){
    ticker := time.NewTicker(5 * time.Minute)
    for {
        select {
        case <- ticker.C:
            SyncLocalCache()    
        }
    }
}

优缺点

  • 跨平台
  • 仅单机可用

3. 单机定时任务-ScheduledExcutorService

例:

public static void main(String[] args) {
        scheduleTest();
        //scheduleFixedRate();
        //scheduleWithFixedDelay();
    }

    //schedule()的用法,可以对任务进行延迟处理
    static void scheduleTest(){
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
        //获取当前时间
        long cur = System.currentTimeMillis();
        scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                //当前任务执行时候,对应的时间
                System.out.println("延迟了"+(System.currentTimeMillis() - cur) + "ms");
            }
        },3000, TimeUnit.MILLISECONDS);
        scheduledExecutorService.shutdown();
    }

4. 任务调度- Quartz

例:创建调度器、jobDetail 实例、trigger 实例、执行

public static void main(String[] args) throws Exception {  
    // 1.创建调度器 Scheduler  
    SchedulerFactory factory = new StdSchedulerFactory();  
    Scheduler scheduler = factory.getScheduler();  
  
    // 2.创建JobDetail实例,并与MyJob类绑定(Job执行内容)  
    JobDetail job = JobBuilder.newJob(MyJob.class)  
        .withIdentity("job1", "group1")  
        .build();  
  
    // 3.构建Trigger实例,每隔30s执行一次  
    Trigger trigger = TriggerBuilder.newTrigger()  
        .withIdentity("trigger1", "group1")  
        .startNow()  
        .withSchedule(simpleSchedule()  
                      .withIntervalInSeconds(30)  
                      .repeatForever())  
        .build();  
  
    // 4.执行,开启调度器  
    scheduler.scheduleJob(job, trigger);  
    System.out.println(System.currentTimeMillis());  
    scheduler.start();  
  
    //主线程睡眠1分钟,然后关闭调度器  
    TimeUnit.MINUTES.sleep(1);  
    scheduler.shutdown();  
    System.out.println(System.currentTimeMillis());  
}

运行结果

image.png 最后一个是这节课学习的内容,我个人理解是分布式的多主机的定时任务

分布式定时任务核心架构(对于这个不是很了解)

  • 控制台Admin
  • 触发器Trigger
  • 调度器Scheduler
  • 执行器Executor

知识点扩充

  • 时间轮(陌生)
  • 延时消息(听说过)
  • 离线计算引擎 Hive

    • 大数据技术课本里学过,老朋友了
  • 实时计算引擎 Flink
    • 大数据技术课本里学过,老朋友了

本次预习就到这里,期待明天的课