分布式定时任务那些事儿| 青训营笔记

163 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

今天主要记录的是分布式定时任务那些事儿之一

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

首先介绍发展历程

Windows批处理

Case1:10分钟后Windows电脑自动关机

  • Step1:桌面空白处右键单击-新建-文本文档
  • Step2:更改文件名和后缀为“自动关机.bat”
  • Step3:修改文件内容为“shutdown -s -t 600”,代表10分钟后关机
  • Step4:双击运行该批处理文件,电脑将会在10分钟之后自动关机

Windows任务计划程序

Case2:每天12:00自动疫情打卡

  • Step1:我的电脑右键单击-管理
  • Step2:打开Windows任务计划程序,新建一个任务,设定执行命令
  • Step3:该命令可由Python脚本编写,抓取任务请求,注册进任务请求

Linux命令-CronJob

Case3:每天02:30定时清理机器日志

  • *min(0-59) *hour(0-23) *day of month(1-31) *month(1-12) *day of week(0-6) command to exceeded
  • 如30 2 * * * clean_log.sh
  • Linux系统命令,使用简单,稳定可靠
  • 只能控制单台机器,且无法适用于其他操作系统

单机定时任务-Timer、Ticker

Case4:每隔5分钟定时刷新本地缓存数据

  • Java:
public static void main(String[] args) throws ParseException {
    Timer timer = new Timer();
    timer.schedule(new TimerTask(){
        @Override
        public void run(){
            SyncLocalCache();
        }
    }, 5000, 5 * 60 * 1000);
}
  • Go:
func main(){
    ticker := time.NewTicker(S * timer.Minute)
    for {
        select {
        case <-ticker.C:
            SynclocalCache()
        }
    }
}
  • 跨平台
  • 仅单机使用

单机定时任务-ScheduledExecutorService

Case5:每隔5分钟定时执行多个任务

private static ScheduledExecutorService scheduler;
public static void main(String[] args) throws Exception {
    Scheduler = Executors.newScheduledThreadPool(5);
    
    scheduler.scheduleAtFixedRate(({
        new Runnable() {
            @Override
            public void run(){
                DoSomething();
            }
        })),
    0, 300,
    TimeUnit.SECONDS);
}
  • 拥有线程池功能
  • 仅单机使用

任务调度-Quartz

image.png

分布式定时任务

image.png

用多台机器整体协调完成分布式定时任务

这是一个平台,可以分布式部署,性能大幅提高,支持大数据,详细技术等部分在下一篇笔记中介绍