xxl-job是在定时任务框架quartz(支持分布式任务调度,通过数据库竞争锁来实现)的基础上实现的,但是修改了任务调度的模式,并且任务调度采用注册和RPC调用方式来实现。
技术栈
mysql、ssm、内置netty作为RPC服务调用、quartz
先来聊聊什么是任务调度:
传统实现定时任务的方式:Thread线程、TimeTask一个轻量级定时任务队列框架,用于设置定时任务、ScheduleExecutorService定时周期执行任务、Quartz定时任务框架。
这些方式都在单点系统使用,一旦job服务器宕机之后,就必须采取一些措施:
- 使用心跳检测监控自动重启、任务补偿机制(任务做标记)
- 定时任务在执行代码的时候中间突然报错,使用日志记录错误,跳过继续执行,在使用定时Job 扫描日志错误记录,进行补偿信息。
- 定时Job 在执行的时候,导致整个 Job 异常结束掉,发送邮件通知给运维人员。
分布式定时任务的方式?XXL-Job、Elastic-job等。不过,既然采用分布式,那么肯定会遇到项目部署集群,导致任务重复执行多次;具体操作如下:
1:Zookeeper 实现分布式锁,每次保证拿到锁再执行,效率比较低。
2:配置文件中加入定时任务的开关,但是只能保证一台服务器执行,变为单机服务器。
3:启动的时候使用数据库唯一标识;同样是效率低。
4:分布式调度任务平台,解决了任务幂等问题,Job 负载均衡轮询机制(推荐)。
传统任务调度:
幂等性原因:
集群情况下,两个Tomcat,任务重复执行
传统任务调度的缺点:
- 没有补偿机制
- 不支持集群
- 不支持路由策略
- 大量数据统计
- job管理平台
- 报警邮件通知、状态监控
分布式job调度平台原理:
任何job现在任务调度平台执行,在由任务调度平台路由到实际job服务器。
底层采用quartz
传统的定时任务,几乎无法做到高可用,
再加上项目部署集群,会导致任务幂等性问题;此时分布式定时任务调度平台便发挥了作用,本篇文章咱们拿 XXL-Job 来进行说明;相关作用如下:
1:支持Job集群,Job 负载均衡轮询机制保证幂等性问题
2:支持Job补偿,如果Job执行失败的话,会自动实现重试机制,超过重启次数后,会发送邮件通知运维人员。
3:支持Job日志记录。
4:动态配置定时规则,传统定时Job触发规则都是写死在代码中。