中 进阶
分布式定时任务#
一句话答案#
XXL-JOB(轻量可视化,推荐)/ ElasticJob(基于 ZK)实现分布式定时任务,支持分片/故障转移/执行日志。
核心要点
方案对比:
| 方案 | 特点 |
|---|---|
| XXL-JOB | 轻量/可视化/社区活跃(推荐) |
| ElasticJob | 基于ZK/分片策略丰富 |
| Quartz集群 | 数据库锁协调/功能基础 |
核心能力: 任务分片 / 故障转移 / 可视化调度 / 执行日志
面试回答(2分钟版)
在集群环境下,如果用 Spring 自带的 @Scheduled,每台机器都会执行一遍同样的任务,导致重复执行。所以我们需要分布式定时任务框架来做统一调度。我在项目中用的是 XXL-JOB,它的架构分为调度中心和执行器两部分:调度中心负责任务的分配和触发,执行器部署在各个应用实例上负责实际执行。它支持任务分片,比如一个大数据量的任务可以按 ID 取模分成多片并行处理,大幅提升效率。还支持故障转移,某个执行器挂了会自动把任务转给其他节点。另外它有完善的可视化控制台,可以查看执行日志、手动触发、暂停任务。和 ElasticJob 相比,XXL-JOB 更轻量,不依赖 ZooKeeper,社区也更活跃。要注意分布式定时任务和 MQ 的场景不同,定时任务是时间驱动,MQ 是事件驱动。
追问与易错
追问方向:
- “XXL-JOB 分片原理?”→ 调度中心将任务按分片参数(如 shardIndex/shardTotal)分发给多个执行器实例,每个实例根据自己的分片号处理对应数据段(如 id % shardTotal == shardIndex),实现并行处理
- “执行失败怎么重试?”→ XXL-JOB 支持配置失败重试次数和重试间隔,也支持故障转移模式(failover)自动转移到其他执行器节点重试;业务层也要保证任务幂等,防止重试导致重复执行
- “和 MQ 区别?”→ 定时任务是时间驱动(按 Cron 表达式周期执行),MQ 是事件驱动(有消息就消费);定时任务适合批处理/对账/报表等周期性场景,MQ 适合实时异步解耦场景
易错点:
- ❌ 用 @Scheduled 就够——集群多实例重复执行
- ❌ 能替代 MQ——场景不同