xxl-job分片广播/分片任务的简单示例

前段时间更新了xxl-job分布式任务调度平台的简单示例,今天来看一看调度平台任务管理中任务的高级配置之分片广播

分片广播其实就是把一个任务分成多个片段执行。之前的简单任务,当使用调度平台执行时,其实这个任务只执行一次,假设这个任务中有需要查询100万的数据需求,此时执行该任务可能时间会很长,如果数据量再大一点,时间会更长,为了解决这个问题,xxl-job作者提供了一个分片广播的策略,就是将这个100万的查询分成两个、三个....多个片段去执行,如果之前查询100万数据的单个执行任务的时间为10秒,使用分片广播将100万数据的查询分成两个片段,如果这两个片段各自查询50万数据,使用分片广播策略,调度器会同时调度两台机器的同一个执行器,同时执行任务,那么查询时间会就会压缩到5秒提升了效率和速度。

什么是机器?

我个人理解的机器就是服务器,同一个项目可以同时部署在多个服务器上,每个服务器都有自己的ip,那么就不难理解调度器的分片广播策略就是调度同一个项目的同一个执行器,又因为该项目部署在多个服务器上,那么调度器会直接调度部署了这个项目的这几台服务器去执行同一个定时任务,每个服务器执行一部分。

例如项目A部署在 服务器a和服务器b,现在项目A有一个定时任务是查询100万的数据,如果使用之前的轮询策略,在xxl-job调度平台配置好执行器和执行任务时,查询100万数据的这个任务要么由服务器a执行,要么由服务器b执行,都是从1查到100万,当选择分片广播策略时,xxl-job会同时调度服务器a和服务器b,然后根据你在定时任务中设置的分片规则(假设你设置的规则是a查询前50万,b查询后50万),这时两台服务器都在执行这个定时任务,不再是只有一台执行,另一台空闲,那么查询效率就提升了。

下面是分片广播的示例。

1.运行xxl-job-admin,浏览器输入http://127.0.0.1:8080/xxl-job-admin/,登录调度平台,不知道这一步怎么操作的,可以查看我之前的文章:

超详细!xxl-job分布式任务调度平台的简单示例和使用_xxljob的token 在哪设置-CSDN博客

2.如果你已经看完了上面的文章,那么现在打开自己创建的项目

在定时任务类中添加下面的代码,其中shardTotal和shardIndex这两个变量是分片参数

@XxlJob("broadcastJob")
    public void broadcastJob() {
        // 分片参数ShardTotal,shardIndex是通过Xxl-job的XxlJobHelper的方法获取的,由xxl-job自己完成分片的分配。
        int ShardTotal = XxlJobHelper.getShardTotal(); // 分片总数
        int shardIndex = XxlJobHelper.getShardIndex(); // 当前分片项

        //假设有100条数据需要查询
        int listSize = 100;
        // 执行任务逻辑或分片规则
        if (shardIndex == 0) {
            for (int i = 1; i <= listSize / 2; i++) {
                System.out.println("分片总数:" + ShardTotal + "当前片为:" + shardIndex + " is running: " + i);
            }
        } else  {
            for (int i = 51; i <= 100; i++) {
                System.out.println("分片总数:" + ShardTotal + "当前片为:" + shardIndex + " is running: " + i);
            }

        }

    }

 3.因为现在我们在自己的电脑上,不能同时部署到两台机器上,我们需要改变当前项目的端口号和xxl-job的端口号以便可以使用idea将同一个项目启动两次,首先我们点击

复制这个实例

接着选择第一个实例,设置modify options

点击ok然后打开项目application.properties

打开配置文件,配置内容如下 服务端口号为8088,执行器端口号为9999,点击通过启动类启动服务

spring.application.name=xxl-job_demo
server.port=8088

logging.config=classpath:logback.xml
#调度中心部署地址,多个配置逗号分隔 "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

#执行器token,非空时启用 xxl-job, access token
xxl.job.accessToken=default_token

# 执行器app名称,需要和调度中心可视化控制台执行器那边配置一样的名称,不然注册不上去
xxl.job.executor.appname=test-xxl-job

# [选填]执行器注册:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。
#从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=

#[选填]执行器IP :默认为空表示自动获取IP(即springboot容器的ip和端口,可以自动获取,也可以指定),多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务",
xxl.job.executor.ip=

# [选填]执行器端口号:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999

#执行器日志文件存储路径,需要对该路径拥有读写权限;为空则使用默认路径
xxl.job.executor.logpath=/data/logs/xxl-job/executor

#执行器日志保存天数
xxl.job.executor.logretentiondays=30

然后重复上面的步骤,我们选中实例2 这次将 --server.port改为8087

我们再次打开application.properties,修改服务端口为8087,执行器端口号为9998,再通过启动类启动服务

可以看见同一个项目启动了两个服务

4.现在打开调度平台,可以看见执行器已经注册成功,是两个机器节点

5.打开任务管理,点击新增,配置任务,确定

6. 点击操作,执行一次可以看见idea的控制台,两个实例都执行了,一个执行了前五十个,一个执行了后五十个。

7.查看调度日志,可以看见执行成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值