背景概述
业务场景中经常有一些场景需要使用定时任务,比如:
- 时间驱动的场景:某个时间点发送优惠券,发送短信,取消未支付订单等等。
- 批量处理数据:批量统计上个月的账单,全量同步商品数据等等。
- 固定频率的场景:每隔一定时间需要执行一次。
传统的定时任务实现方案,比如Timer,Quartz等都或多或少存在一些问题:
- 不支持集群高可用,没有监控、故障告警等。
- 没有统一管理平台,不支持统计和追踪各个服务节点任务调度的结果等
- 不支持分布式任务调度:同一个服务多个实例的任务存在互斥时,需要统一的调度。
ElasticJob
elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案 , 由两个相对独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 。
ElasticJob-Lite定位是无中心化的分布式定时调度框架,采用zookeeper实现分布式协调,实现任务高可用以及分片。
ElasticJob-Cloud提供资源治理、应用分发以及进程隔离等功能。
ElasticJob-Lite | ElasticJob-Cloud | |
---|---|---|
无中心化 | 是 | 否 |
资源分配 | 不支持 | 支持 |
作业模式 | 常驻 | 常驻 + 瞬时 |
部署依赖 | ZooKeeper | ZooKeeper + Mesos |
实现原理
1. 作业启动
2. 作业执行
缺点
elasticjob是无中心化的,通过ZooKeeper的选举机制选举出主服务器。如果主服务器挂了,会重新选举新的主服务器。
因此elasticjob具有良好的扩展性和可用性,但是使用和运维有一定的复杂。