文章内容输出来源:
拉勾教育Java高薪训练营
为什么会有调度问题
什么是调度?
调度,也就是通俗讲的定时任务,它的形式是:每隔一段时间执行/在特定某一时刻执行。
调度(定时任务)的场景
- 订单审核、出库
- 订单超时⾃动取消、⽀付退款
- 礼券同步、⽣成、发放作业
- 物流信息推送、抓取作业、退换货处理作业
- 数据积压监控、⽇志监控、服务可⽤性探测作业
- 定时备份数据
- ⾦融系统每天的定时结算
- 数据归档、清理作业
- 报表、离线数据分析作业
什么是分布式调度
分布式调度有两重含义:
1、调度任务运行在分布式集群环境下,同一个定时任务部署多份,但同时只应该有一个任务在跑;
2、定时任务的分布式,也就是定时任务的拆分,既把一个大的作业任务拆分为多个小的作业任务,同时执行。
如何实现分布式调度
定时任务的实现⽅式
定时任务的实现方式有多种,早期没有定时任务框架的时候,我们会使⽤JDK中的Timer机制和多线程机制(Runnable+线程休眠)来实现定时或者间隔⼀段时间执⾏某⼀段程序;后来有了定时任务框架,⽐如⼤名鼎鼎的Quartz任务调度框架,使⽤时间表达式(包括:秒、分、时、⽇、周、年)配置某⼀个任务什么时间去执⾏。
但是在分布式集群架构环境下,Quartz已经不能更好的满⾜我们需求,我们可以使⽤专业的分布式调度框架,比如Elastic-job。
Elastic-Job
Elastic-Job是当当⽹开源的⼀个分布式调度解决⽅案,基于Quartz⼆次开发的,由两个相互独⽴的⼦项⽬Elastic-Job-Lite和Elastic-Job-Cloud组成。
这里只介绍Elastic-Job-Lite,一般情况下使用Elastic-Job-Lite就够了,它定位为轻量级⽆中⼼化解决⽅案,使⽤Jar包的形式提供分布式任务的协调服务,⽽Elastic-Job-Cloud⼦项⽬需要结合Mesos以及Docker在云环境下使⽤。
主要功能介绍
- 分布式调度协调
在分布式环境中,任务能够按指定的调度策略执⾏,并且能够避免同⼀任务多实例重复执⾏ - 丰富的调度策略
基于成熟的定时任务作业框架Quartz cron表达式执⾏定时任务 - 弹性扩容缩容
当集群中增加某⼀个实例,它应当也能够被选举并执⾏任务;当集群减少⼀个实例时,它所执⾏的任务能被转移到别的实例来执⾏。 - 失效转移
某实例在任务执⾏失败后,会被转移到其他实例执⾏ - 错过执⾏作业重触发
若因某种原因导致作业错过执⾏,⾃动记录错过执⾏的作业,并在上次作业完成后⾃动触发。 - ⽀持并⾏调度
⽀持任务分⽚,任务分⽚是指将⼀个任务分为多个⼩任务项在多个实例同时执⾏。 - 作业分⽚⼀致性
当任务被分⽚后,保证同⼀分⽚在分布式环境中仅⼀个执⾏实例。