4. XXL-JOB 架构设计
XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计围绕“调度中心”与“执行器”分离的架构思想展开。本章将深入剖析其整体架构、通信机制、注册与发现原理以及路由策略,帮助你在部署和二次开发时建立清晰的系统认知。
4.1 整体架构:调度中心与执行器
XXL-JOB 采用经典的 中心化调度 + 分布式执行 模型。系统由两大核心组件构成:
- 调度中心(Admin):负责任务的调度管理、日志监控、执行器注册管理。它是一个无状态的服务集群,通过数据库锁保证调度任务的唯一性。
- 执行器(Executor):负责接收调度指令并执行具体的业务逻辑。执行器以 Jar 或 Docker 方式部署,通过注册方式与调度中心建立联系。
架构优势: 调度中心与执行器完全解耦。调度中心不关心业务代码,执行器不关心调度策略。这种设计使得调度中心可以统一管理数千个执行器节点,而执行器可以独立扩缩容,互不影响。
下图展示了 XXL-JOB 的整体架构与核心交互流程:
4.2 通信机制:RPC 与 HTTP 混合
XXL-JOB 的通信机制分为两个层面:
| 通信场景 | 协议 | 说明 |
|---|---|---|
| 调度中心 → 执行器 | 自定义 RPC (基于 Netty HTTP) | 调度中心通过嵌入式 Netty HTTP 服务向执行器发送调度请求,执行器暴露回调接口接收指令。 |
| 执行器 → 调度中心 | HTTP (Restful API) | 执行器通过 HTTP 请求向调度中心注册、心跳、回调结果。 |
| 调度中心集群内部 | 无直接通信 | 依赖数据库锁保证调度任务不被重复执行,各节点独立运行。 |
RPC 设计要点: XXL-JOB 并未引入 Dubbo 或 gRPC 等重量级 RPC 框架,而是基于 Netty 的 HTTP 协议实现了轻量级 RPC。执行器启动时会启动一个嵌入式的 Netty HTTP Server,调度中心通过该 Server 的 URL 直接下发任务。这种设计减少了外部依赖,部署更简单。
4.3 注册与发现
XXL-JOB 的注册与发现机制是保证动态扩缩容的核心。其工作流程如下:
- 执行器启动:读取配置文件中的调度中心地址列表,向所有调度中心节点发送注册请求(包含 AppName、IP、Port)。
- 调度中心接收:将执行器信息写入数据库的
xxl_job_registry表,并更新最近心跳时间。 - 心跳续约:执行器每隔 30 秒(可配置)向调度中心发送心跳,调度中心更新对应记录的时间戳。
- 失效剔除:调度中心每隔 90 秒扫描注册表,剔除超过 120 秒未上报心跳的执行器节点。
- 动态发现:调度中心在触发任务时,从数据库查询该任务绑定的执行器 AppName 对应的所有在线节点列表。
注意: 注册信息存储在数据库中,而非内存。这意味着调度中心重启后,执行器需要重新注册。如果执行器数量较大(超过 5000 个),建议调整心跳间隔和清理周期,避免数据库写入压力过大。
注册表核心字段如下:
| 字段 | 类型 | 说明 |
|---|---|---|
registry_group |
VARCHAR(255) | 执行器 AppName,用于分组 |
registry_key |
VARCHAR(255) | 执行器地址,格式 IP:Port |
update_time |
DATETIME | 最近心跳时间 |
4.4 路由策略
当任务被触发时,调度中心需要从执行器集群中选择一个具体的节点来执行任务。XXL-JOB 提供了丰富的路由策略,以适应不同的业务场景:
| 策略名称 | 算法描述 | 适用场景 |
|---|---|---|
| 第一个 | 取注册列表中的第一个节点 | 测试环境、固定节点执行 |
| 最后一个 | 取注册列表中的最后一个节点 | 灰度发布、新节点验证 |
| 轮询 | 按顺序依次分配,每个节点轮流执行 | 负载均衡、无状态任务 |
| 随机 | 随机选择一个节点 | 负载均衡、简单分发 |
| 一致性 HASH | 根据任务 ID 或 ShardingIndex 计算 Hash,映射到节点环 | 分片任务、数据亲和性要求高 |
| 最不经常使用(LFU) | 优先选择最近使用次数最少的节点 | 长耗时任务、避免热点 |
| 最近最久未使用(LRU) | 优先选择最近最久未使用的节点 | 缓存型任务、连接池复用 |
| 故障转移 | 按顺序尝试,失败则切换到下一个节点 | 高可用、关键业务任务 |
| 忙碌转移 | 检查节点当前任务队列长度,选择最空闲的节点 | 任务执行时间不均匀、资源敏感 |
| 分片广播 | 向所有节点广播任务,每个节点根据分片参数执行对应分片 | 大数据处理、批量任务(如 1000 万数据分 10 片) |
下图展示了轮询与分片广播两种典型路由策略的执行流程对比:
策略选择建议:
- 无状态、执行时间均匀的任务 → 轮询 或 随机。
- 需要数据分片处理(如批量数据清洗)→ 分片广播。
- 任务执行时间差异大、资源敏感 → 忙碌转移 或 LFU。
- 关键业务、不允许失败 → 故障转移。