2. 调度平台核心概念:任务、触发器、调度器、执行器与分片
在深入索引选择与部署实践之前,必须先建立调度平台的通用认知模型。无论使用 Quartz、Elastic-Job、XXL-JOB 还是 Apache Airflow,其底层抽象都围绕五个核心概念展开:任务(Job)、触发器(Trigger)、调度器(Scheduler)、执行器(Executor)与分片(Sharding)。这五个概念构成了调度平台的“积木块”,理解它们之间的关系是后续所有优化与排障的基础。
2.1 任务(Job)—— 调度的执行单元
任务是调度平台中最基本的业务抽象,它定义了“要做什么”。一个任务通常包含业务逻辑代码、输入参数以及执行结果的处理方式。从架构视角看,任务是一个可被调度器发现、触发器激活、执行器运行的逻辑单元。
| 属性 | 说明 | 典型配置示例 |
|---|---|---|
| Job Name | 任务唯一标识,用于在调度器中注册与查找 | order-statistics-job |
| Job Group | 任务分组,便于按业务域管理 | order-service |
| Job Data | 任务运行时上下文参数,支持 KV 结构 | {"date":"2025-04-01"} |
| Description | 任务描述,用于运维人员识别 | 每日凌晨统计前一日订单数据 |
| Misfire Policy | 错过触发时间后的处理策略 | 立即执行一次 / 忽略 / 等待下次 |
2.2 触发器(Trigger)—— 调度的触发条件
触发器决定了任务“何时执行”。它负责根据时间规则或事件条件生成触发信号,并将信号传递给调度器。常见的触发器类型包括:
- Cron Trigger: 基于 Cron 表达式,支持秒级到年级的周期性调度。例如
0 0 2 * * ?表示每天凌晨 2 点执行。 - Simple Trigger: 基于固定间隔和重复次数,适合“每 5 分钟执行一次,共执行 10 次”的场景。
- Calendar Trigger: 在 Cron 基础上叠加日历排除规则,如跳过法定节假日。
- Event Trigger: 基于外部事件(如消息队列、文件到达、HTTP 回调)触发,适合流式或事件驱动场景。
触发器与任务的关系是多对多:一个任务可以绑定多个触发器(例如同时支持 Cron 和事件触发),一个触发器也可以关联多个任务(但实践中较少使用,通常建议一对一绑定以保持清晰)。
2.3 调度器(Scheduler)—— 调度的决策中枢
调度器是整个平台的大脑,它负责:
- 注册与管理: 维护任务与触发器的元数据,支持动态增删改查。
- 触发决策: 监听触发器信号,判断任务是否满足执行条件(如资源配额、依赖状态、并发限制)。
- 任务分发: 根据负载均衡策略(轮询、一致性哈希、最少连接)将任务分配给合适的执行器。
- 状态追踪: 记录任务的执行状态(运行中、成功、失败、超时),支持重试与告警。
在分布式架构中,调度器通常是一个无状态集群,通过分布式锁(如 ZooKeeper、Redis Redlock)或数据库乐观锁来保证同一时刻只有一个调度器实例处理触发事件,避免重复调度。
2.4 执行器(Executor)—— 调度的执行引擎
执行器是任务实际运行的载体,它运行在业务应用进程中,负责接收调度器下发的任务指令并执行。执行器的核心职责包括:
- 任务注册: 启动时向调度中心注册自身信息(IP、端口、任务列表、资源容量)。
- 任务执行: 通过线程池或协程池并发执行任务,支持同步/异步模式。
- 结果回传: 执行完成后将状态(成功/失败/超时)、日志、耗时等数据上报给调度器。
- 健康检查: 定期发送心跳,调度器根据心跳判断执行器是否存活,实现故障转移。
| 特性 | 单机执行器 | 分布式执行器集群 |
|---|---|---|
| 部署方式 | 嵌入业务应用 | 独立部署或嵌入业务应用 |
| 任务分发 | 本地执行 | 调度器按策略分发 |
| 故障处理 | 单点故障 | 自动摘除故障节点,任务迁移 |
| 扩展性 | 受限于单机资源 | 水平扩展,支持大规模任务 |
| 典型框架 | Quartz 单机模式 | XXL-JOB、Elastic-Job |
2.5 分片(Sharding)—— 分布式调度的核心能力
分片是分布式调度平台区别于单机调度器的关键特性。它解决了“如何将一个大任务拆分成多个子任务,并分配给不同的执行器并行执行”的问题。分片的核心价值在于:
- 水平扩展: 任务处理能力随执行器数量线性增长。
- 负载均衡: 避免单点瓶颈,充分利用集群资源。
- 故障隔离: 单个分片失败不影响其他分片,只需重试失败分片。
分片策略通常分为两类:
- 静态分片: 在任务配置时指定分片总数和分片参数,执行器根据自身序号(Sharding Index)处理对应数据。例如分片总数为 4,执行器 0 处理 ID 模 4 余 0 的数据。
- 动态分片: 执行器启动时向调度中心注册,调度中心根据当前存活执行器数量动态计算分片。当执行器扩缩容时,分片自动重新分配,无需人工干预。
2.6 五大概念的关系总结
将上述五个概念串联起来,可以形成调度平台的完整执行链路:
在实际项目中,这五个概念对应着不同的代码模块和配置项。例如在 XXL-JOB 中:
- 任务 对应
@XxlJob("handlerName")注解的方法。 - 触发器 对应调度中心的任务配置中的 Cron 表达式。
- 调度器 对应调度中心集群,负责触发和分发。
- 执行器 对应部署了 XXL-JOB 客户端的业务应用。
- 分片 对应调度中心任务配置中的“分片广播”模式。