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

京东云开发者
• 阅读 133

现在市面上有各式各样的分布式定时任务,每个都有其独特的特点,我们这边的项目因为一开始使用的是分布式开源调度框架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.提供可视化界面监控任务的运行情况

作者:京东零售 马成龙

来源:京东云开发者社区

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java目前可以通过以下几种方式进行定时任务
1、单机部署模式Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行。提供的功能比较单一,无法实现复杂的调度任务。ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。
Wesley13 Wesley13
2年前
ubuntu使用crontab定时java任务
设置定时任务每个用户都可以使用crontab设置定时任务每个用户的crontab文件都被保存在/var/spool/cron/crontabs目录中,其文件名与用户名一致使用crontabe编辑定时任务!(https://oscimg.oschina.net/oscnet/upc2a3ec2fe5f0f2660b2
Easter79 Easter79
2年前
SpringBoot定时任务动态修改cron表达式改变执行周期
一、场景引入前不久做过一个根据下载指令定时下载文件到服务器的需求。轮询下载的周期需要根据下载任务量的大小动态修改,下载任务密集的时候就周期缩小,下载任务少量时就扩大周期时间。java本身和第三方开源框架Spring共有三种执行定时任务的方式:1)Java自带的java.util.Timer类:这个类允许你调度一个java.util.TimerT
Stella981 Stella981
2年前
Spring Boot 集成 XXL
在开发中需要将已有的定时任务抽离出来,方便管理查看,因此选择集成分布式任务调度平台XXLJOB,本文就讲解下SpringBoot如何集成XXLJOB任务调度平台。XXLJOB简介XXLJOB是一个分布式任务调度平
Easter79 Easter79
2年前
Synctoy2.1使用定时任务0X1
环境描述:公司需要在windows上面使用双向文件同步,目前发现SyncToy可以实现这个功能,但是在Windows2012上面,添加定时任务的时候,执行状态总是0x1,定时任务配置确认多次,肯定没有问题;同样在windows10上面设置定时任务,就能运行,在google上面查了好多帖子,都是这样,都没有解决,大多数说是windows的bug,可以使用
Wesley13 Wesley13
2年前
PHP之定时任务(绝对实用)
在工作中经常会用到定时任务,除了在js中有定时器这个玩意可以用于前端页面的定时任务;那么后端PHP如何设置定时任务呢?一.如下是javascript中使用setTimeout和setInterval设置定时任务:1setTimeout(function(){2console.log('timeout');
Stella981 Stella981
2年前
JFinal Quartz 支持配置文件和持久化
    随着需求的增加,现在要定时启动一个调度和计划任务,原先写的QuartzPlugin,是持久化保存到数据库中的,从数据库中读取任务并执行。要是添加一个每天循环任务,就要在代码里写一次开始任务的代码,执行后,再注释掉,最后重启项目。否则会因为启动同name,同group的任务而报错org.quartz.ObjectAlreadyExistsE
Stella981 Stella981
2年前
Laravel 技巧之 定时任务
定时任务ScheduledTasks是Laravel提供的组件之一,稍微上点规模的项目应该都会用到,比如开发微信应用时通过定时任务去刷新accesstoken,比如每天定时发推送提现用户要记得签到。对于定时任务的基本用法,官网文档已经描述得很详细了,这里不再多说。本文主要是介绍定时任务在实际应用中的两个小技巧:1\.多个任务并行执行
京东云开发者 京东云开发者
11个月前
定时任务原理方案综述 | 京东云技术团队
本文主要介绍目前存在的定时任务处理解决方案。业务系统中存在众多的任务需要定时或定期执行,并且针对不同的系统架构也需要提供不同的解决方案。京东内部也提供了众多定时任务中间件来支持,总结当前各种定时任务原理,从定时任务基础原理、单机定时任务(单线程、多线程)、分布式定时任务介绍目前主流的定时任务的基本原理组成、优缺点等。希望能帮助读者深入理解定时任务具体的算法和实现方案。
京东云开发者 京东云开发者
6个月前
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了