XXL-JOB 分布式任务调度
候选人小张去字节跳动面试,面试官看了他的项目经验,问了一个很直接的问题:
"你们用的什么定时任务方案?"
小张说:"XXL-JOB。"
面试官追问:"那 XXL-JOB 是怎么实现分布式调度的?调度中心和执行器之间是怎么通信的?"
小张说:"通过 HTTP...?"
面试官点点头:"那执行器挂了怎么办?任务分片是怎么实现的?"
小张停顿了一下,说:"分片...我们没用到。"
面试官继续追问:"那 XXL-JOB 的路由策略有哪些?你们用的是什么?"
小张答不上来。
【面试官心理】
这道题我其实在考察他对分布式调度系统的理解深度。XXL-JOB 是目前国内最流行的分布式调度平台之一,能把 XXL-JOB 的原理讲清楚的候选人,至少对 RPC 通信、任务分片、HA 方案有基本认知。但大多数候选人只是"用过",不知道"怎么实现的"。连路由策略都说不全,说明他根本没有仔细看过 XXL-JOB 的文档。
一、为什么需要分布式调度 🔴
1.1 Quartz 的局限性
在讲 XXL-JOB 之前,先说清楚为什么 Quartz 在分布式场景下不够用:
Quartz 的架构是"中心化"的——所有调度逻辑都集中在一个地方(数据库),集群只是多个"抢锁的节点"。这在任务量小的时候没问题,但一旦上了规模就扛不住。
1.2 XXL-JOB 的核心架构
XXL-JOB 采用的是分离式架构:调度中心和执行器完全独立,通过 HTTP 或 RPC 通信。调度中心只负责任务的"触发",执行器负责"执行"。这就好比"指挥部"和"作战部队"的分离。
二、调度中心核心原理 🔴
2.1 任务注册与触发流程
2.2 路由策略:任务分发给哪个执行器
这是面试官最爱的追问点。XXL-JOB 提供了 10 种路由策略:
:::tip 💡 路由策略的选择取决于业务场景:
- ROUND(轮询):适用于无状态任务,均匀分配负载
- CONSISTENT_HASH(一致性哈希):适用于需要同一任务始终在同一节点执行(比如本地缓存预热)
- FAILOVER(故障转移):适用于重要任务,需要快速故障恢复
- SHARDING_BROADCAST(分片广播):适用于数据同步场景,所有节点同时执行不同分片 :::
2.3 调度线程池与错失触发
为什么要两个线程池? 因为调度线程需要严格按时间触发(预读 5 秒内的任务),而执行线程负责实际的 HTTP 调用。如果把两者混在一起,HTTP 调用慢会阻塞调度。
三、执行器核心原理 🔴
3.1 执行器的自注册机制
3.2 任务执行入口
3.3 执行结果回调
四、分片广播:数据并行的核心 🟡
4.1 分片任务的使用场景
分片广播是 XXL-JOB 最强大的功能之一,适用于大数据量拆分场景:
4.2 分片广播的执行流程
五、故障转移与任务丢失防护 🔴
5.1 执行器的超时与丢失检测
5.2 任务堆积与优先级
六、常见翻车现场 🔴
❌ 翻车点一:分片任务使用不当导致数据重复
❌ 翻车点二:任务中抛异常但没正确处理
七、面试追问链 🟡
追问一:XXL-JOB 和 Quartz 的核心区别是什么?
追问二:XXL-JOB 的调度中心挂了怎么办?
调度中心是单节点部署的(社区版),如果调度中心挂了:
- 已触发的任务会继续在执行器上执行
- 但新的任务不会被触发
- 恢复后,需要手动补偿错失的任务触发
生产环境建议:
- 双机部署调度中心(社区版不支持集群)
- 或者使用 XXL-JOB 的高可用方案(社区在推进中)
【面试官心理】
问到调度中心单点问题的候选人,说明他有高可用意识。我会继续追问:"如果让你们自己设计一个高可用的调度中心,你会怎么做?"能回答出主备切换或选举机制的候选人,通常有架构设计能力。