ElasticJob 是由当当网开源的分布式调度解决方案,后成为 Apache ShardingSphere 子项目。它基于 Quartz 引擎,但通过去中心化架构、弹性扩容、作业分片等特性,解决了传统定时任务框架在分布式环境下的痛点。以下是其核心详解:
一、核心概念与架构设计
1. 架构特性
- 去中心化设计:无单点故障,所有节点地位对等,通过 ZooKeeper 或 Etcd 协调。
- 弹性扩容:支持动态增减节点,任务分片自动重新分配。
- 轻量级无中心化设计(ElasticJob-Lite):基于 Zookeeper 实现分布式协调,无需额外中间件。
- 容器化部署(ElasticJob-Cloud):适配 Mesos/K8s,支持动态资源调度。
2. 核心组件
- 作业注册中心:存储任务配置、节点状态、分片信息(依赖 Zookeeper/Etcd)。
- 作业执行器:实际执行任务的 JVM 进程,可部署多个实例。
- 调度器:负责任务分片、节点协调、故障转移。
二、关键功能详解
1. 分布式调度
- 分片策略:将任务拆分为多个分片(Shard),每个节点执行部分分片。
- 示例:100 万条数据清洗任务,分 10 个分片,每个节点处理 1 个分片。
- 分片参数传递:通过
ShardingContext
获取分片序号和总数,实现业务逻辑分片。
2. 弹性扩容
- 动态扩缩容:新增节点时,自动从注册中心获取分片并执行任务。
- 数据倾斜优化:支持自定义分片算法(如按 Hash 值、范围分片)。
3. 故障转移
- 节点宕机:其他节点自动接管其分片任务。
- 脑裂防护:通过 Zookeeper 选举 Leader,避免多节点同时执行同一分片。
4. 作业类型
- Simple 作业:单次执行任务(如数据迁移)。
- Dataflow 作业:支持流式处理(如消息队列消费),可配置
streaming_process=true
实现持续拉取。 - Script 作业:执行 Shell/Python 脚本。
5. 监控与管理
- Web 控制台:查看任务状态、分片信息、历史日志。
- API 接口:动态修改任务参数(如 CRON 表达式)、暂停/恢复任务。
- Metric 指标:集成 Prometheus 暴露任务执行耗时、成功率等指标。
三、使用场景
1. 海量数据迁移
- 痛点:单节点处理 1 亿条数据耗时过长。
- 方案:分 100 个分片,10 个节点并行处理,理论提速 10 倍。
2. 定时报表生成
- 需求:每天 0 点生成全国销售报表。
- 实现:配置 CRON 表达式
0 0 0 * * ?
,分省份分片生成。
3. 系统维护任务
- 案例:清理 7 天前日志、刷新缓存。
- 优势:避免集中式调度压力,支持灰度发布(逐步扩容节点)。
4. 订单超时处理
- 场景:30 分钟未支付订单自动关闭。
- 实现:Dataflow 作业持续扫描订单表,按分片处理不同订单段。
四、实际应用案例
1. 电商订单处理
- 架构:
- 3 个 ElasticJob 节点,分 10 个分片。
- 每个分片处理 1 个省份的订单超时检测。
- 效果:
- 扩容节点时,分片自动重新分配,无人工干预。
- 故障节点任务 30 秒内转移至健康节点。
2. 金融风控数据同步
- 场景:实时同步交易数据至风控系统。
- 方案:
- 使用 Dataflow 作业,
streaming_process=true
持续拉取 MQ。 - 按用户 ID 分片,确保同一用户数据由同一节点处理。
- 使用 Dataflow 作业,
3. 物流轨迹跟踪
- 需求:每 5 分钟聚合快递位置数据。
- 实现:
- Simple 作业按快递公司分片,并行处理不同公司数据。
- 结合 Redis 缓存中间结果,减少数据库压力。
五、对比 XXL-JOB
特性 | ElasticJob | XXL-JOB |
---|---|---|
架构 | 去中心化(依赖 ZK/Etcd) | 中心化(调度中心 + 执行器) |
扩容 | 自动分片重分配 | 需手动调整路由策略 |
故障转移 | 自动接管 | 依赖调度中心重试 |
学习曲线 | 较高(需理解分片概念) | 较低(可视化配置) |
适用场景 | 海量数据、高并发分片 | 轻量级定时任务、快速集成 |
六、最佳实践
- 分片策略选择:
- 数据均匀分布:按 Hash(key) % 分片数。
- 范围查询:按时间范围分片(如每天一个分片)。
- 资源隔离:
- 重要任务单独部署集群,避免资源竞争。
- 监控告警:
- 集成 Prometheus + Grafana,监控任务延迟、分片不均衡。
- 版本升级:
- 使用 ElasticJob 3.x 版本,支持 Spring Boot Starter。
通过以上详解,您已掌握 ElasticJob 的核心架构、功能特性及适用场景。实际部署时,建议结合业务规模选择 ElasticJob-Lite(快速上手)或 ElasticJob-Cloud(容器化环境),并参考官方文档进行深度配置优化。