现在市面上有各式各样的分布式定时任务,每个都有其独特的特点,我们这边的项目因为一开始使用的是分布式开源调度框架 TBSchedule,但是这个框架依赖 ZK,由于 ZK 的不稳定性和项目老旧无人维护,导致我们的定时任务会偶发出现异常,比如:任务停止、任务项丢失、任务不执行等;
每逢 618 大促,在单量很大的情况下,如果出现定时任务异常,会导致订单的积压,进而导致订单的履约时效,严重影响商家的履约效率,造成订单取消、客户投诉等;
为了保障整体的稳定性,在改动成本比较小的情况下,达到快速实现,稳定运行,预防这种偶发异常,我们实现了一种轻量级定时任务来进行无缝隙降级;
1.支持集群、分布式
2.灵活的任务分片
3.动态的服务扩容和资源回收
4.支持单个任务线程数的设置和实时调整
1.为了保障单个系统的稳定性,我们去中心化,单独调度自己的系统的任务
2.为了避免 ZK 的不稳定性,我们通过 redis 实现注册中心和动态分片功能
3.避免使用 timer,改用线程池来控制线程
4.为了减少改造成本,不需要业务系统改动代码,我们自动实现 TBSchedule 内部方法,保持原来的入参
5.为了支持更多任务,支持动态调整线程数,增加系统的处理能力
1.通过 xml 配置,引入 jar 包方式,实现快速接入
2.基本实现 TBSchedule 主要功能,基础方法和 TBSchedule 保持一致,无切换成本
3.通过 ducc 配置,配合应急预案,支持手动或者自动进行降级,无缝衔接,可随时随地操作,为大促保驾护航
4.线上已运行,动态分片稳定,心跳检查及时,随时可降级,帮助订单系统避免多次 zk 波动带来的影响
通过轻量级的降级,搭配应急预案触发,保障大促的稳定运行!!!!!
1.改用 Quartz 作为定时任务的触发器(也可搭配 easyjob),支持更多形式的定时配置,完美替代 TBSchedule;
2.提供可视化界面监控任务的运行情况
作者:京东零售 马成龙
来源:京东云开发者社区