当前位置: 代码网 > it编程>编程语言>Java > SpringBoot集成XXL-JOB实现灵活控制的分片处理方案

SpringBoot集成XXL-JOB实现灵活控制的分片处理方案

2024年09月26日 Java 我要评论
场景一个应用需要支持大量数据的批处理任务,要求:并行处理能力:应用需能够同时处理多个数据块,即实现并行处理。灵活的并发控制:可以灵活调整并行处理的任务数量,以确保资源利用最大化且不过载。均衡负载分配:

场景

一个应用需要支持大量数据的批处理任务,要求:

  • 并行处理能力:应用需能够同时处理多个数据块,即实现并行处理。
  • 灵活的并发控制:可以灵活调整并行处理的任务数量,以确保资源利用最大化且不过载。
  • 均衡负载分配:应将任务均匀分配到不同的服务器节点上,以平衡各节点的负载,避免单点压力过大。

解决思路

因为需要并行处理同一张数据表里的数据,所以比较自然地想到了分片查询数据,可以利用对 id 取模的方法进行分片,避免同一条数据被重复处理。那xxl-job 的路由策略「分片广播 & 动态分片」很贴合这种场景」来调度定时任务;

实现demo

springboot环境下,我们集成xxl-job来实现上述方案。
springboot如何集成xxl-job查看官网即可,这里不再叙述,下面看下分片调度的代码:

1.xxl-job调度管理页面配置分片调度任务

路由策略选择: 分片广播

2. 编写task代码:

要获取分片总数和当前分片序号,作为参数传给sql语句:

	@resource
    private orderdatamapper orderdatamapper;
	
    @xxljob("orderdatastatustask")
    public void orderdatastatustask() {
		// 计时器
        stopwatch timer = stopwatch.createstarted();
        
		// 获取xxl-job的localthread中的总的分片数和当前分片
		orderdataparam param = new orderdataparam();
        param.setshardindex(xxljobhelper.getshardindex());
        param.setshardtotal(xxljobhelper.getshardtotal());
        // 其他参数设置,略了....
        
		// 根据分片数拉取当前分片的数据
        list<orderdata> orderdatalist = orderdatamapper.getinitstatusorder(param);
        xxljobhelper.log("获取待处理订单数据:分片号={},数据量={},总分片数={}", xxljobhelper.getshardindex(), orderdatalist.size(), xxljobhelper.getshardtotal());
        if (collutil.isempty(orderdatalist)) {
            return;
        }
        // 处理逻辑,略了....
        
        xxljobhelper.log("当前分片({})处理完成,耗时={}秒", xxljobhelper.getshardindex(), timer.stop().elapsed(timeunit.seconds));
    }

这里服务启动了4个实例,总分片数shardtotal就是4,每个实例的shardindex分别是0,1,2,3

3. mybatis中编写sql语句

根据分片总数和当前分片数据对id哈希取模, 这里做了两次hash,主要作用是用id最后一位hash方便直接看出数据被哪个分片调度了。

	// 获取未处理的订单数据
	// 根据id末位数取hash后分片拉取
	<select id="getinitstatusorder" parametertype="com.xxx.orderdataparam"
            resulttype="com.xxx.orderdata">
			select id,order_no,customer_code,
            from tt_order_data t
            where t.status = 0
				  and t.fail_count <![cdata[ < ]]> #{retrycount}
				  and t.update_time <![cdata[ >= ]]> #{lastupdatetime}
				  and mod(mod(t.id, 10) , #{shardtotal}) = #{shardindex}
			limit 0,200	
	</select>	

4.最后看下调度日志

同一次调度任务,4个实例个调度一次,并且拉取到各自部分的数据进行处理:

第3个实例的调度日志:

	    2024-09-25 08:31:40 [com.xxl.job.core.thread.jobthread#run]-[130]-[thread-144] 
		----------- xxl-job job execute start -----------
		----------- param:{"lasthoursagomodify":4,"rows":3000,"lastmonthagocreate":6,"retrycount":1}
		2024-09-25 08:31:40 [com.xxx.xxxx#orderdatastatustask]-[47]-[thread-144] 获取待处理订单数据:分片号=3,数据量=100,总分片数=4
		2024-09-25 08:31:41 [com.xxx.xxxx#orderdatastatustask]-[53]-[thread-144] 当前分片(3)处理完成,耗时=1秒
		2024-09-25 08:31:41 [com.xxl.job.core.thread.jobthread#run]-[176]-[thread-144] 
		----------- xxl-job job execute end(finish) -----------
		----------- result: handlecode=200, handlemsg = null
		2024-09-25 08:31:41 [com.xxl.job.core.thread.triggercallbackthread#callbacklog]-[197]-[xxl-job, executor triggercallbackthread] 
        ----------- xxl-job job callback finish.

第4个实例的调度日志:

	    2024-09-25 08:31:40 [com.xxl.job.core.thread.jobthread#run]-[130]-[thread-144] 
		----------- xxl-job job execute start -----------
		----------- param:{"lasthoursagomodify":4,"rows":3000,"lastmonthagocreate":6,"retrycount":1}
		2024-09-25 08:31:40 [com.xxx.xxxx#orderdatastatustask]-[47]-[thread-144] 获取待处理订单数据:分片号=4,数据量=80,总分片数=4
		2024-09-25 08:31:41 [com.xxx.xxxx#orderdatastatustask]-[53]-[thread-144] 当前分片(4)处理完成,耗时=1秒
		2024-09-25 08:31:41 [com.xxl.job.core.thread.jobthread#run]-[176]-[thread-144] 
		----------- xxl-job job execute end(finish) -----------
		----------- result: handlecode=200, handlemsg = null
		2024-09-25 08:31:41 [com.xxl.job.core.thread.triggercallbackthread#callbacklog]-[197]-[xxl-job, executor triggercallbackthread] 
        ----------- xxl-job job callback finish.

到此这篇关于springboot集成xxl-job实现灵活控制的分片处理方案的文章就介绍到这了,更多相关springboot xxl-job分片处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com