当前位置: 首页 > 后端技术 > Java

使用ElasticJob的分片配置加速任务执行,提高资源利用率

时间:2023-04-02 00:03:30 Java

在上一篇文章中,我们介绍了如何使用ElasticJob实现定时任务。解决了使用@Scheduled实现时存在的竞争问题,也实现了定时任务的高可用执行。但是,还有一类问题我们在做定时任务的时候容易出现,那就是任务执行速度过长;同时为了实现定时任务的高可用,也启动了很多任务实例,但是每个任务都执行。实例正在运行,资源利用率不高。那么,下面继续介绍,利用ElasticJob的sharding配置来加速任务执行,提高资源利用率的目标!自己试试吧。建议直接下载文末仓库中的chapter7-2工程,然后在此基础上进行修改。当然,如果你还没有进入如何使用ElasticJob,那就先去之前的文章铺垫一下知识,再继续下面的内容吧!第一步:创建分片执行任务@Slf4j@ServicepublicclassMyShardingJobimplementsSimpleJob{@Overridepublicvoidexecute(ShardingContextcontext){switch(context.getShardingItem()){case0:log.info("Shard1:Executetask");休息;case1:log.info("Shard2:Executetask");休息;case2:log.info("Shard3:Executetask");休息;}}}这里使用switch判断当前任务上下文的sharding-item值来执行不同的分片任务。sharding-item的值取决于后面要配置的分片总数,但是注意是从0开始计数,这里只用打印日志的方式来展示分片效果。在真正实现业务逻辑的时候,一定要记得根据分片的数量来设计执行任务的分片操作。例如:可以根据批任务的id区分不同的分片处理不同的数据,避免重复执行带来的问题。第二步:在配置文件中设置配置任务的实现类,执行表达式,参数elasticjob.jobs.jobs.my-sharding-job.elastic-job-class=com.didispace.chapter73.MyShardingJobelasticjob。jobs.my-sharding-job.cron=0/5****?elasticjob.jobs.my-sharding-job.sharding-total-count=3这里设置为3,所以任务会被分成3个shards,每个分片对应第一步中的一个switch分支。运行测试单实例运行完成上述代码后,尝试启动上述实现的第一个实例。此时,我们可以看到该实例每5秒会打印如下日志:2021-07-2117:42:00.122INFO63478---[main].s.b.j.ScheduleJobBootstrapStartupRunner:StartingElasticJobBootstrap.2021-07-2117:42:00.126INFO63478---[main]org.quartz.core.QuartzScheduler:调度程序my-sharding-job_$_NON_CLUSTERED已启动。2021-07-2117:42:00.126INFO63478---[main].s.b.j.ScheduleJobBootstrapStartupRunner:ElasticJobBootstrapstarted.2021-07-2117:42:05.254INFO63478---[-sharding-job-1]com.didispace.chapter73.MyShardingJob:分片1:执行任务2021-07-2117:42:05.254INFO63478---[-sharding-job-3]com.didispace.chapter73.MyShardingJob:分片3:执行工作2021-07-2117:42:05.254INFO63478---[-sharding-job-2]com.didispace.chapter73.MyShardingJob:分片2:执行任务2021-07-2117:42:10.011INFO63478---[-sharding-job-4]com.didispace.chapter73.MyShardingJob:Shard1:Executingtask2021-07-2117:42:10.011INFO63478---[-sharding-job-5]com.didispace.chapter73.MyShardingJob:Shard2:Executetask2021-07-2117:42:10.011INFO63478---[-sharding-job-6]com.didispace.chapter73.MyShardingJob:Shard3:Executetask每次任务被拆分成3个分片任务,我上面说了,每个分片对应一个switchbranch由于目前我们只启动了一个实例,所以3个分片任务都分配给了这个唯一的实例。双实例运行接下来我们再启动一个实例(注意使用-Dserver.port改变不同的端口,否则本地启动会失败)。此时,两个实例的日志发生了变化:Logofinstance1:2021-07-2117:44:50.190INFO63478---[ng-job_Worker-1]com.didispace.chapter73.MyShardingJob:Shard2:执行任务2021-07-2117:44:55.007INFO63478---[ng-job_Worker-1]com.didispace.chapter73.MyShardingJob:分片2:执行任务2021-07-2117:45:00.010INFO63478---[ng-job_Worker-1]com.didispace.chapter73.MyShardingJob:Shard2:任务实例2的执行日志:2021-07-2117:44:50.272INFO63484---[-sharding-job-1]com.didispace.chapter73.MyShardingJob:分片1:执行任务2021-07-2117:44:50.273INFO63484---[-sharding-job-2]com.didispace.chapter73.MyShardingJob:分片3:执行任务2021-07-2117:44:55.009INFO63484---[-sharding-job-3]com.didispace.chapter73.MyShardingJob:Shard1:执行任务2021-07-2117:44:55.009INFO63484---[-sharding-job-4]com.didispace.chapter73.MyShardingJob:Sharding3:执行任务随着实例数量的增加,可以看到分片的分配发生了变化。这也意味着当一个任务开始执行时,两个任务执行实例都会被利用,这样我们的任务执行效率和资源利用率就可以得到优化。也可以尝试不断启动实例和关闭实例来观察任务的动态分配,怎么样?这样写定时任务是不是更方便?一定要记得自己写,这样才能更深刻的体会!遇到问题可以拉取文末代码示例,对比是否有配置差异。在下一篇文章中,我们会继续介绍一些关于定时任务的进阶内容。本系列教程《Spring Boot 2.x基础教程》直接点击!,欢迎收藏转发!如果你在学习过程中遇到困难?大家可以加入我们的Spring技术交流群,参与交流讨论,更好的学习进步!代码示例本文的完整工程可以在如下仓库的chapter7-3目录查看:Github:https://github.com/dyc87112/SpringBoot-Learning/Gitee:https://gitee.com/didispace/SpringBoot-Learning/如果您觉得这篇文章不错,欢迎Star支持,您的关注是我坚持的动力!欢迎关注我的公众号:程序员DD,分享别处看不到的知识和思考