这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
定时任务
自动化+定时执行+海量数据+高效稳定 = 分布式定时任务
分类
linux命令CronJob
优点:简单方便,稳定
缺点:只能同步一台机器。
用代码维护
比如Java的Timer,Go的Ticker
单机定时任务-ScheduledExecutorService
优点:有线程池功能
缺点:单机
任务调度-Quartz
缺点:没有负载均衡,不算分布式。
任务调度
任务调度的背景
在业务系统中有很多这样的场景:
1、账单日或者还款日上午 10 点,给每个信用卡客户发送账单通知,还款通知。如 何判断客户的账单日、还款日,完成通知的发送?
2、银行业务系统,夜间要完成跑批的一系列流程,清理数据,下载文件,解析文件, 对账清算、切换结算日期等等。如何触发一系列流程的执行?
3、金融机构跟人民银行二代支付系统对接,人民银行要求低于 5W 的金额(小额支付)半个小时打一次包发送,以缓解并发压力。所以,银行的跨行转账分成了多个流程: 录入、复核、发送。如何把半个小时以内的所有数据一次性发送?
类似于这种 1、基于准确的时刻或者固定的时间间隔触发的任务,或者 2、有批量数据需要处理,或者 3、要实现两个动作解耦的场景,我们都可以用任务调度来实现。
任务调度工具对比
| 层次 | 举例 | 特点 |
|---|---|---|
| 操作系统 | Linux crontab Windows 计划任务 | 只能执行简单脚本或者命令 |
| 数据库 | MySQL、Oracle | 可以操作数据。不能执行 Java 代码 |
| 工具 | Kettle | 可以操作数据,执行脚本。没有集中配置 |
| 开发语言 | JDK Timer、ScheduledThreadPool | Timer:单线程 JDK1.5 之后:ScheduledThreadPool(Cache、Fiexed、Single):没有集中配置,日程管理不够灵活 |
| 容器 | Spring Task、@Scheduled | 不支持集群 |
| 分布式框架 | XXL-JOB,Elastic-Job |
分布式定时任务原理
- 控制台(Admin):提供任务管理和干预的功能。
- 触发器(Trigger):解析任务,生成触发事件。
- 调度器(Scheduler):分配任务,管理任务生命周期。
- 执行器(Executor):获取执行任务单元,执行任务逻辑。