怎么为kill job引入安全检查点机制

发布时间:2021-12-22 11:29:39 作者:iii
来源:亿速云 阅读:135

本篇内容主要讲解“怎么为kill job引入安全检查点机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么为kill job引入安全检查点机制”吧!

关于XXL-JOB-ONION

XXL-JOB-ONION是基于XXL-JOB的二次开发,我们基于XXL-JOB二次开发做了扩展,如添加ONION_BEAN运行模式、完善告警功能。

怎么为kill job引入安全检查点机制

关于ONION_BEAN模式:

背景

根据我们目前项目中的定时任务考察,发现定时任务大多都有一个共同点:每个定时任务都是从数据库查询一批数据出来处理,并且将每条数据转为一个Runable放入业务隔离的线程池中执行,例如:

@Component
public class OnionXxlJob implements OnionJobHandler<JobParam> {
   @Override
   public void doExecute(JobParam param) throws Exception {
       // 实际从数据库查询
       List<Integer> orderIds = Arrays.asList(10000, 11111);
       // 这里使用并行流模拟将每个订单放入线程池处理
       orderIds.parallelStream().forEach(orderService::handlerOrder);
   }
}

由于定时任务每次执行需要处理大批量数据,可能执行一次需要一个半小时,为解决每次版本更新或者应对突发数据量需要修改配置重启时都需要等待定时任务执行完成、想kill不敢kill的尴尬,我们为xxl-job引入安全检查点机制,灵感来源于jvm垃圾回收的安全检查点机制。

为什么说想kill不敢kill?

虽然需要涉及到数据库的操作都放在事务中,但并不是所有操作都能回滚,例如修改redis缓存数据、ES数据的操作都无法回滚(一般能放到事务提交之后的都放到后面执行),如果处理数据的过程中需要调用第三方接口,那么会更复杂(这点我们已经通过回放机制实现)。

假设几百个线程同时在处理,突然kill掉执行中的任务,意味着可能几百条数据处理出现问题,我们不得不找出这些数据,将未完成的步骤完成。

概要设计

我们先分析下XXL-JOB的kill job流程:xxl-job-admin前端发起kill请求,admin接收后向执行器发起kill请求并携带jobId,执行器根据jobId判断当前任务是否再执行,如果是则取消。

是否有一种方案,当定时任务管理员从后台发起kill job操作时,先等待任务进入一个安全点再kill任务呢?

我们来看下面这张图:

怎么为kill job引入安全检查点机制

流程说明:

关于安全检查点的设计

怎么为kill job引入安全检查点机制

安全检查点:定时任务中Runable调用的业务方法

比如定时关闭超时未支付订单的定时任务,查询出的每个超时订单,都会调用一个关闭订单的方法,那么这个方法就可以设置为安全检查点。

由于安全检查点需要结合业务考虑,因此我们在设计上,只提供一个检查点注解,让使用者自己决定将哪个方法设置为安全检查点、以及是否需要设置安全检查点。

缺点:通过AOP方式,只能支持将public的方法设置为安全检查点。

考虑过使用字节码增强方式,强行将检查行为插入private方法,但可能会导致应用启动速度变慢,如果有需要的话,我们再考虑这种方法。

但我们也提供了编程式解决这个缺点,与Spring实现的事务机制一样,安全检查点支持注解方式使用,也支持编程式使用。

关于安全检查管理员角色的设计:

只通过计数器统计当前进入安全检查点方法的线程数无法做到“原子性”,在任务执行的过程中,每时每刻都有新的Runable进入安全检查点方法,也每时每刻都有Runable从安全检查点方法出来。

通过安全检查管理员控制Runable是否可以进入安全检查点方法,在等待计数器值变为0之前,不再让Runable进入安全检查点,能够解决“原子性”等待问题。

两种使用方式

1、注解方式使用

怎么为kill job引入安全检查点机制

注解方式使用要求方法必须是public的,与Spring注解式事务一样,也存在不生效的问题。

2、编程方式使用

怎么为kill job引入安全检查点机制

编程式使用也仅需三个步骤:

到此,相信大家对“怎么为kill job引入安全检查点机制”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. Linux捕捉信号机制之(signal,kill)、(sig
  2. mysql 多表查询等值连接、为表取别名

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

kill job

上一篇:如何实现支持Canvas的Leaflet.Path.DashFlow动态流向线

下一篇:Strust2怎么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》