分布式调度中心学习总结

注:本文所说分布式调度中心,等同于分布式定时任务;

定时器相关技术介绍

crontab 命令

crontab是类UNIX系统的一个命令,用于设置需要周期性执行的指令,有对应的crontab 文件。crontab储存的指令被守护进程crond激活。
分为两类:
系统任务调度:系统级别,存在/etc或者/etc下子目录,管理员编辑权限;
用户任务调度,用户级别, 存在/var/spool/cron目录下,文件名与用户名一致。
crontab文件的配置格式:

crontab的命令行常用选项:

JDK Timer

单线程,Timer类,TimerTask类及其几种任务调度方法;
缺陷:
时间不准确延迟:
异常终止:
执行周期任务时依赖系统时间:

ScheduledExecutor

基于线程,实现类ScheduledThreadPoolExecutor,是一个线程池,常用的4种调度方式:

相对于Timer的优势:
- 并发执行
- 线程隔离
- 与系统时间无关
- 执行过程中抛出异常则会终止,不会影响其他任务,业务层捕获异常

spring scheduler

TaskExecutor、TaskScheduler、Trigger三个抽象接口,

quartz

Job、JobDetail、Trigger、Scheduler;
quartz整合spring;
quartz整合spring boot;

cron表达式

分布式需求

业务量大,数据量大,节点多等等情况促成分布式定时任务的产生。其核心问题:某个定时任务在一个触发时刻仅有一台服务器在运行。
解决方案:
1. 单服务器执行所有任务,pass(单点故障,任务量大,效率不够……)
2. 配置参数分散运行,增加运维管理配置参数的难度,单点问题依然存在。
3. 全局锁互斥执行,抢占执行,某个节点获取到任务key对应的锁,则执行任务,否则不执行,解决多节点重复执行的问题。
分布式定时任务的处理方式:抢占式、协同式;
特点:高可用性,可伸缩性,负载均衡,失效转移;
核心:分布式锁,利用互斥来防止彼此干扰来保证一致性。
分布式锁的三种实现方式:
1. 基于数据库;
2. 基于redis;
3. 基于zookeeper;
zookeeper,内部是一个分层的文件系统目录树结构,规定在同一个目录下面只能有一个唯一文件名。节点类型:永久节点,临时节点,顺序节点。监视器watcher。实现分布式锁的步骤:

开源产品

quartz分布式

只有使用JobStore的quartz才具有集群功能。jar包里面有数据库脚本,表明和作用略(12张表),quartz.properties,spring-quartz.xml配置文件;quartz通过数据库实现分布式锁机制。表QRTZ_LOCKS,行锁表,悲观锁;两种存储方式,RAMJobStore(内存),以及JobStoreSupport(JDBC,数据库)。
被错过执行的job,misfired job,可能的原因:
1. 系统重启;
2. Trigger被暂停(suspend);
3. 线程池中所有的线程都被占用,导致任务无法被触发执行;
4. 有状态任务(StatefulJob)在下次触发时间到达时,上次的任务还没有结束。
应对策略:

TBSchedule

Elastic-job

技术栈

JDK的timer,ScheduledExecutor,spring batch,quartz,淘宝开源TBSchedule,elastic-job

扫描二维码关注公众号,回复: 3520976 查看本文章

猜你喜欢

转载自blog.csdn.net/lonelymanontheway/article/details/82119632