背景:接收项目中有个自研的分布式调度项目,因此进行调研及了解下开源的项目
1、 基础概念
1. 什么是定时任务
定时任务形式:每隔必定时间/特定某一时刻执行前端
场景:git
- 订单审核、出库
- 订单超时自动取消、支付退款
- 礼券同步、生成、发放做业
- 物流信息推送、抓取做业、退换货处理做业
- 数据积压监控、日志监控、服务可用性探测做业
- 定时备份数据
- 金融系统天天的定时结算
- 数据归档、清理做业
- 报表、离线数据分析做业
2. 定时任务与消息队列的区别
共同点
- 异步处理:好比注册、下单事件
- 应用解耦: 无论定时任务做业仍是MQ均可以做为两个应用之间的齿轮实现应用解耦,这个齿轮能够中转数据,固然单体服务不须要考虑这些,服务拆分的时候每每都会考虑。
- 流量削峰: 双十一的时候,任务做业和MQ均可以用来扛流量,后端系统根据服务能⼒定时处理订单或者从MQ抓取订单抓取到一个订单到来事件的话触发处理,对于前端用户来讲看到的结果是已经下单成功了,下单是不受任何影响的。
本质区别
- 定时任务做业是时间驱动,而MQ是事件驱动。
时间驱动是不可代替的,好比金融系统每日的利息结算,不是说利息来一条(利息到来事件)就算一下,而每每是经过定时任务批量计算; - 定时任务做业更倾向于批处理,MQ倾向于逐条处理。
3. 分布式和集群的区别
- 分布式
把一个系统拆分为多个子系统,每一个子系统负责各自的那部分功能,独立部署,各司其职。 - 集群
多个实例共同工做,最简单/最多见的集群是把一个应用复制多份部署。 - 区别
分布式必定是集群:集群就是多个实例一块儿工做,分布式将一个系统拆分后那就是多个实例。
集群不必定是分布式:由于复制型集群不是拆分而是复制。
4. 什么是分布式调度
两层含义:
- 运行在分布式集群环境下的调度任务
同一个定时任务程序部署多份,只应该有一个定时任务在执行 - 分布式调度—>定时任务的分布式—>定时任务的拆分
即为把一个大的做业任务拆分为多个小的做业任务,同时执行
- elastic-job:当当开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,实现任务高可用以及分片,目前是版本2.15,而且能够支持云开发
- Saturn:是惟品会自主研发的分布式的定时任务的调度平台,基于当当的elastic-job 版本1开发,而且能够很好的部署到docker容器上。
- xxl-job: 是大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展
XXL-JOB
xxl-job有下面一些特色:github
- 简单:支持经过Web页面对任务进行CRUD操做,操做简单,一分钟上手;
- 动态:支持动态修改任务状态、启动/中止任务,以及终止运行中任务,即时生效;
- 调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
- 执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA;
- 注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
- 弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会从新分配任务;
- 路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不常常使用、最近最久未使用、故障转移、忙碌转移等;
- 故障转移:任务路由策略选择"故障转移"状况下,若是执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
- 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖以前调度;
- 事件触发:除了"Cron方式"和"任务依赖方式"触发任务执行以外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发。
- 任务进度监控:支持实时监控任务进度;
- Rolling实时日志:支持在线查看调度结果,而且支持以Rolling方式实时查看执行器输出的完整的执行日志
开源地址
https://github.com/xuxueli/xxl-jobdocker
我的感受:不管是自研仍是开源,项目总体库表简单清晰。系统复杂度在于调用逻辑编排及资源抢占方式等后端