4. XXL-JOB 架构设计

XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计围绕“调度中心”与“执行器”分离的架构思想展开。本章将深入剖析其整体架构、通信机制、注册与发现原理以及路由策略,帮助你在部署和二次开发时建立清晰的系统认知。

4.1 整体架构:调度中心与执行器

XXL-JOB 采用经典的 中心化调度 + 分布式执行 模型。系统由两大核心组件构成:

  • 调度中心(Admin):负责任务的调度管理、日志监控、执行器注册管理。它是一个无状态的服务集群,通过数据库锁保证调度任务的唯一性。
  • 执行器(Executor):负责接收调度指令并执行具体的业务逻辑。执行器以 Jar 或 Docker 方式部署,通过注册方式与调度中心建立联系。
架构优势: 调度中心与执行器完全解耦。调度中心不关心业务代码,执行器不关心调度策略。这种设计使得调度中心可以统一管理数千个执行器节点,而执行器可以独立扩缩容,互不影响。

下图展示了 XXL-JOB 的整体架构与核心交互流程:

XXL-JOB 整体架构图 XXL-JOB 整体架构图 调度中心 (Admin) 任务调度管理 日志监控 执行器注册管理 集群部署 · 无状态 调度数据库 (MySQL) 执行器 (Executor) 接收调度指令 执行业务逻辑 心跳上报 集群部署 · 水平扩展 RPC 通信 注册 / 心跳 核心交互流程 ① 执行器启动 → 向调度中心注册自身 IP:Port ② 调度中心触发任务 → 通过 RPC 向执行器下发指令 ③ 执行器执行完毕 → 回调调度中心上报执行结果

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 的注册与发现机制是保证动态扩缩容的核心。其工作流程如下:

  1. 执行器启动:读取配置文件中的调度中心地址列表,向所有调度中心节点发送注册请求(包含 AppName、IP、Port)。
  2. 调度中心接收:将执行器信息写入数据库的 xxl_job_registry 表,并更新最近心跳时间。
  3. 心跳续约:执行器每隔 30 秒(可配置)向调度中心发送心跳,调度中心更新对应记录的时间戳。
  4. 失效剔除:调度中心每隔 90 秒扫描注册表,剔除超过 120 秒未上报心跳的执行器节点。
  5. 动态发现:调度中心在触发任务时,从数据库查询该任务绑定的执行器 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 片)

下图展示了轮询与分片广播两种典型路由策略的执行流程对比:

路由策略对比:轮询 vs 分片广播 路由策略对比:轮询 vs 分片广播 轮询策略 调度中心 执行器 A 执行器 B 执行器 C 第1次 第2次 第3次 分片广播策略 调度中心 分片 0 分片 1 分片 2 广播 广播 广播 每个节点执行不同的数据分片
策略选择建议:
  • 无状态、执行时间均匀的任务 → 轮询 或 随机。
  • 需要数据分片处理(如批量数据清洗)→ 分片广播。
  • 任务执行时间差异大、资源敏感 → 忙碌转移 或 LFU。
  • 关键业务、不允许失败 → 故障转移。