一种轻量级定时任务实现 | 京东云技术团队

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

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

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

我们使用的TBSchedule特性:

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.提供可视化界面监控任务的运行情况

作者:京东零售 马成龙

来源:京东云开发者社区

相关推荐
我学上瘾了5 小时前
Spring Cloud的前世今生
后端·spring·spring cloud
波波0076 小时前
ASP.NET Core 健康检查实战:不只是一个 /health 接口
后端·asp.net
小码哥_常6 小时前
Spring Boot 搭建邮件发送系统:开启你的邮件自动化之旅
后端
霖霖总总6 小时前
[Redis小技巧32]Redis分布式锁的至暗时刻:从原理演进到时钟跳跃的终极博弈
数据库·redis·分布式
ZC跨境爬虫6 小时前
Scrapy分布式爬虫(单机模拟多节点):豆瓣Top250项目设置与数据流全解析
分布式·爬虫·python·scrapy
石榴树下的七彩鱼7 小时前
图片修复 API 接入实战:网站如何自动去除图片水印(Python / PHP / C# 示例)
图像处理·后端·python·c#·php·api·图片去水印
我叫黑大帅7 小时前
为什么TCP是三次握手?
后端·网络协议·面试
我叫黑大帅7 小时前
如何排查 MySQL 慢查询
后端·sql·面试
techdashen7 小时前
Rust项目公开征测:Cargo 构建目录新布局方案
开发语言·后端·rust
消失的旧时光-19437 小时前
Spring Boot 实战(五):接口工程化升级(统一返回 + 异常处理 + 错误码体系 + 异常流转机制)
java·spring boot·后端·解耦