2021年7月28日星期三

使用Elastic Job的分片配置加速任务执行和提高资源利用率

上一篇,我们介绍了如何使用Elastic Job实现定时任务。解决了使用@Scheduled来实现时候存在的竞争问题,同时也实现了定时任务的高可用执行。

然而,还有一类问题是我们在做定时任务时候容易出现的,就是任务执行速度时间过长;同时,为了实现定时任务的高可用,还启动了很多任务实例,但每个任务执行时候就一个实例在跑,资源利用率不高。

所以,接下来我们就来继续介绍,使用Elastic Job的分片配置,来为任务执行加加速,资源利用抬抬高的目标!

动手试试

建议直接下载文末仓库中的chapter7-2工程,然后在这个基础上进行修改。当然,如果你对如何使用Elastic Job还不输入,那么先前往上一篇做个知识铺垫,再继续下面的内容!

第一步:创建一个分片执行的任务

@Slf4j@Servicepublic class MyShardingJob implements SimpleJob { @Override public void execute(ShardingContext context) {  switch (context.getShardingItem()) {   case 0:    log.info("分片1:执行任务");    break;   case 1:    log.info("分片2:执行任务");    break;   case 2:    log.info("分片3:执行任务");    break;  } }}

这里通过switch来判断当前任务上下文的sharding-item值来执行不同的分片任务。sharding-item的值取决于后面将要配置的分片总数,但注意是从0开始计数的。 这里仅采用了日志打印的方式,来展示分片效果,真正实现业务逻辑的时候,一定记得根据分片数量对执行任务也要做分片操作的设计。比如:你可以根据批量任务的id求摩的方式来区分不同分片处理不同的数据,以避免重复执行而出现问题。

第二步:在配置文件中,设置配置任务的实现类、执行表达式、以及将要重要测试的分片总数参数

elasticjob.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个分片,每个分片对应第一步中一个switch的分支。

运行与测试

单实例运行

在完成了上面的代码之后,尝试启动上面实现的第一个实例。

此时,我们可以看到,每间隔5秒,这个实例会打印这样的日志:

2021-07-21 17:42:00.122 INFO 63478 --- [   main] .s.b.j.ScheduleJobBootstrapStartupRunner : Starting ElasticJob Bootstrap.2021-07-21 17:42:00.126 INFO 63478 --- [   main] org.quartz.core.QuartzScheduler   : Scheduler my-sharding-job_$_NON_CLUSTERED started.2021-07-21 17:42:00.126 INFO 63478 --- [   main] .s.b.j.ScheduleJobBootstrapStartupRunner : ElasticJob Bootstrap started.2021-07-21 17:42:05.254 INFO 63478 --- [-sharding-job-1] com.didispace.chapter73.MyShardingJob : 分片1:执行任务2021-07-21 17:42:05.254 INFO 63478 --- [-sharding-job-3] com.didispace.chapter73.MyShardingJob : 分片3:执行任务2021-07-21 17:42:05.254 INFO 63478 --- [-sharding-job-2] com.didispace.chapter73.MyShardingJob : 分片2:执行任务2021-07-21 17:42:10.011 INFO 63478 --- [-sharding-job-4] com.didispace.chapter73.MyShardingJob : 分片1:执行任务2021-07-21 17:42:10.011 INFO 63478 --- [-sharding-job-5] com.didispace.chapter73.MyShardingJob : 分片2:执行任务2021-07-21 17:42:10.011 INFO 63478 --- [-sharding-job-6] com.didispace.chapter73.MyShardingJob : 分片3:执行任务

每次任务都被拆分成了3个分片任务,就如我上文中所说的,每个分片对应一个switch的分支。由于当前情况下,我们只启动了一个实例,所以3个分片任务都被分配到了这个唯一的实例上。

双实例运行

接下来,我们再启动一个实例(注意使用-Dserver.port来改变不同的端口,不然本地会启动不成功)。此时,两个实例的日志出现了变化:

实例1的日志:

2021-07-21 17:44:50.190 INFO 63478 --- [ng-job_Worker-1] com.didispace.chapter73.MyShardingJob : 分片2:执行任务2021-07-21 17:44:55.007 INFO 63478 --- [ng-job_Worker-1] com.didispace.chapter73.MyShardingJob : 分片2:执行任务2021-07-21 17:45:00.010 INFO 63478 --- [ng-job_Worker-1] com.didispace.chapter73.MyShardingJob : 分片2:执行任务

实例2的日志:

2021-07-21 17:44:50.272 INFO 63484 --- [-sharding-job-1] com.didispace.chapter73.MyShardingJob : 分......

原文转载:http://www.shaoqun.com/a/901572.html

跨境电商:https://www.ikjzd.com/

wangwei:https://www.ikjzd.com/w/1744

aca:https://www.ikjzd.com/w/1371

欧苏丹:https://www.ikjzd.com/w/1756


上一篇,我们介绍了如何使用ElasticJob实现定时任务。解决了使用@Scheduled来实现时候存在的竞争问题,同时也实现了定时任务的高可用执行。然而,还有一类问题是我们在做定时任务时候容易出现的,就是任务执行速度时间过长;同时,为了实现定时任务的高可用,还启动了很多任务实例,但每个任务执行时候就一个实例在跑,资源利用率不高。所以,接下来我们就来继续介绍,使用ElasticJob的分片配置,来
亚马逊 海外购:https://www.ikjzd.com/w/998
汇通天下:https://www.ikjzd.com/w/2055
栽黄马褂龙泉山秋冬可看彩叶林 :http://www.30bags.com/a/409753.html
栽面儿:http://www.30bags.com/a/225639.html
宰客现象大搜罗,对"挨宰"say goodbye!:http://www.30bags.com/a/433797.html
再不疯狂真老了 8张火车票走遍最美中国(全文):http://www.30bags.com/a/416248.html
午睡时分 我把疯骚小姨子按倒在床:http://lady.shaoqun.com/m/a/80528.html
两个黑人挺进白领校花体内 被黑人塞得满满的好粗:http://www.30bags.com/m/a/249763.html
11个案例教亚马逊卖家写好产品描述:https://www.ikjzd.com/articles/146992
亚马逊创建秒杀和 7 天促销参加 8 月限时优惠活动:https://www.ikjzd.com/articles/146988
如何提高亚马逊关键词排名,关键词排名优化:https://www.ikjzd.com/articles/146983
女人在公交车上穿超短裙,其实是在男朋友身上穿?你怎么想呢?:http://lady.shaoqun.com/a/438504.html

没有评论:

发表评论