京东零售技术

一种轻量级定时任务实现

现在市面上有各式各样的分布式定时任务,每个都有其独特的特点,我们这边的项目因为一开始使用的是分布式开源调度框架TBSchedule,但是这个框架依赖ZK,由于ZK的不稳定性和项目老旧无人维护,导致我们的定时任务会偶发出现异常,比如:任务停止、任务项丢失、任务不执行等。

每逢618大促,在单量很大的情况下,如果出现定时任务异常,会导致订单的积压,进而导致订单的履约时效,严重影响商家的履约效率,造成订单取消、客户投诉等。

为了保障整体的稳定性,在改动成本比较小的情况下,达到快速实现,稳定运行,预防这种偶发异常,我们实现了一种轻量级定时任务来进行无缝隙降级。

一
我们使用的TBSchedule特性

  1. 支持集群、分布式;
  2. 灵活的任务分片;
  3. 动态的服务扩容和资源回收;
  4. 支持单个任务线程数的设置和实时调整。
二
我们要实现的功能

  1. 为了保障单个系统的稳定性,我们去中心化,单独调度自己的系统的任务。
  2. 为了避免ZK的不稳定性,我们通过redis实现注册中心和动态分片功能。
  3. 避免使用timer,改用线程池来控制线程。
  4. 为了减少改造成本,不需要业务系统改动代码,我们自动实现TBSchedule内部方法,保持原来的入参。
  5. 为了支持更多任务,支持动态调整线程数,增加系统的处理能力。
三
方案实现

Image

四
结果

  1. 通过xml配置,引入jar包方式,实现快速接入。

  2. 基本实现TBSchedule主要功能,基础方法和TBSchedule保持一致,无切换成本。

  3. 通过ducc配置,配合应急预案,支持手动或者自动进行降级,无缝衔接,可随时随地操作,为大促保驾护航。

  4. 线上已运行,动态分片稳定,心跳检查及时,随时可降级,帮助订单系统避免多次zk波动带来的影响。

通过轻量级的降级,搭配应急预案触发,保障大促的稳定运行!!!!!

五
后续计划

  1. 改用Quartz作为定时任务的触发器(也可搭配easyjob),支持更多形式的定时配置,完美替代TBSchedule。

  2. 提供可视化界面监控任务的运行情况。

END
往期回顾

618技术揭秘|探究竞速榜页面核心前端技术

JDV背后的技术-助力618

一文帮你搞定H5、小程序、Taro长列表曝光埋点

618技术揭秘 - 大促弹窗搭投实践

ChatGPT的探索与实践-应用篇

618技术大揭秘:Switchquery秒级配置触达平台的设计与实现

如何从消失的异常堆栈定位线上问题

架构师日记-从技术角度揭露电商大促备战的奥秘

ElasticSearch - 批量更新bulk死锁问题排查

大促质量备战之三化战役:“常态化、精细化、一体化”