分布式调度系统对比:
问题1:集群重复执行
因为没有Job分发功能, 造成各worker资源浪费
问题2:线上Job修改
如果想修改已经上线的定时任务怎么办?
以前:每个应用都引用quartz,单独配置定时任务,一旦上线,难于修改;
现在:无需引用quartz,直接在用户界面配置,可随时修改,随时执行。
问题3:失败异常处理机制
线上的定时任务,如果执行失败了应该怎么办?
以前:每个定时任务需要自己写出错报告,重新执行困难;
现在:出错后自动告警,支持短信、邮件、微信等多种告警方式;提供手动异常处理功能。
问题4:Job处理大批量数据
如果有任务要处理大量数据,该怎么办?
以前:定时任务单机执行,速度较慢,不能充分利用分布式计算。
现在:可由一个定时任务拆分成n个子任务,分配到不同机器执行,充分利用计算资源,执行状态实时监控。
问题5:中断执行中的Job任务
批处理正在执行,发现问题想中断,怎么办?
以前:重启。
现在:可响应用户控制台中断指令。
分布式调度系统的工作原理
1. 服务注册和拉取待执行Job:接入的应用采用poll方式, 通过http协议向服务器获取任务,减少对系统的侵入
2. 任务执行
应用方式:执行拉取的待执行Job,Job需实现统一接口;
异常告警及处理:在执行前后上报执行状态和捕获运行异常,可做以下异常告警:任务未取走、超过预估执行时间、异常结束、取走未执行、任务中止等;
防重:任务执行简单防重。但是存在系统故障,或多节点同时获取taskId导致重复执行,或同一节点的Job尚未取走taskId,1s后再次拉取taskId。业务方应用时应注意
3. 任务中止
中止:在“拉取任务和执行任务时绑定taskId和context上下文,然后context上下文绑定当前线程”;在“汇报任务”时根据taskId获取context,然后执行context绑定线程的interrupt
4. 路由策略
分布式消费者节点以轮询的方式主动拉取Job列表,按照接收到的节点请求的顺序下发,所以路由策略为:轮询
扩展:一致性hash、failover、busyover、轮询,随机,最不经常使用,最近最久不使用。其中可切换为一致性哈希、failover等等策略
5. 主子任务
其顺序为:Job节点(主任务)主动推送入参到该应用的的任务队列;Job节点(子任务)主动拉取该应用的任务队列。从而实现主子任务。
6. 任务积压