• 【 XXL-JOB】 XXL-JOB任务分片


    前言

    xxl-job 是一个分布式任务调度平台,支持定时任务和分片任务。其中,分片任务可以将一个大任务拆分成多个小任务,分布式地执行,提高任务的执行效率和可靠性。分片任务中,有一种特殊的任务类型叫做分片广播任务,可以将一个任务广播到所有的执行器节点上执行,本质上是一种并行执行的方式。

    xxl-job 分片广播任务的详细教程

    创建任务

    在 xxl-job 的管理后台中,创建一个分片广播任务。设置任务的基本信息,包括任务名称、任务描述、任务类型(分片广播)、执行器路由策略等。

    编写任务代码

    编写任务的执行代码,可以使用 Java、Python、Shell 等语言。代码中需要实现一个 execute 方法,用于执行具体的任务逻辑。在分片广播任务中,execute 方法只会在一个执行器节点上执行一次,因此需要考虑并发执行的情况。

    分片参数设置

    在执行器节点上,需要设置分片参数,用于指定任务的分片信息。分片参数包括分片总数和当前分片项,可以通过 xxl-job 的 API 获取。

    执行任务

    在执行器节点上,启动 xxl-job 的执行器程序,等待任务的调度。当任务被调度时,执行器会自动执行任务的 execute 方法,并传入分片参数。在 execute 方法中,可以根据分片参数实现任务的具体逻辑。

    查看任务执行结果

    在 xxl-job 的管理后台中,可以查看任务的执行情况和执行日志。如果任务执行失败,可以查看日志定位问题。

    示例1

    xxl-job 分片广播任务的代码示例:

    @XxlJob("broadcastJob")
    public void broadcastJob() {
        int shardCount = 10; // 分片总数
        int shardIndex = XxlJobHelper.getShardIndex(); // 当前分片项
    
        // 执行任务逻辑
        for (int i = 0; i < 100; i++) {
            if (i % shardCount == shardIndex) {
                // 当前分片项需要执行的任务逻辑
                System.out.println("Shard " + shardIndex + " is running: " + i);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    上述示例中,使用了 xxl-job 的注解 @XxlJob 标记了一个分片广播任务。任务的名称是broadcastJob,任务的执行逻辑在 broadcastJob 方法中实现。首先获取了分片总数和当前分片项,然后根据分片参数执行具体的任务逻辑。任务逻辑是循环输出数字,并根据分片参数判断是否需要执行。这里使用了 xxl-job 的工具类 XxlJobHelper 来获取分片参数。getShardIndex 方法用于获取当前分片项,getShardTotal 方法用于获取分片总数。在任务执行时,xxl-job 会自动传入分片参数,无需手动设置。
    在这里插入图片描述

    示例2

    广播分片处理16个数据库,每个库有32 张表

    @XxlJob("broadcastJob")
    public void broadcastJob() {
        int shardCount = 24; // 分片总数
        int shardIndex = XxlJobHelper.getShardIndex(); // 当前分片项
    
        // 数据库列表
        String[] databases = {"db1", "db2", "db3", "db4", "db5", "db6", "db7", "db8", "db9", "db10", "db11", "db12", "db13", "db14", "db15", "db16"};
    
        // 处理每个数据库
        for (String database : databases) {
            // 表列表
            String[] tables = {"table1", "table2", "table3", "table4", "table5", "table6", "table7", "table8", "table9", "table10", "table11", "table12", "table13", "table14", "table15", "table16", "table17", "table18", "table19", "table20", "table21", "table22", "table23", "table24", "table25", "table26", "table27", "table28", "table29", "table30", "table31", "table32"};
    
            // 处理每张表
            for (String table : tables) {
                if ((shardIndex + table.hashCode()) % shardCount == shardIndex) {
                    // 当前分片项需要处理的表
                    System.out.println("Shard " + shardIndex + " is processing database " + database + ", table " + table);
                    
                    // 执行具体的任务逻辑,例如从数据库中读取数据并进行处理
                    // ...
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    示例中,使用了 xxl-job 的注解 @XxlJob 标记了一个分片广播任务。任务的名称是 broadcastJob,任务的执行逻辑在 broadcastJob 方法中实现。首先获取了分片总数和当前分片项,然后根据分片参数处理每个数据库中的每张表。在本例中,任务逻辑是输出需要处理的表的信息,并执行具体的任务逻辑,例如从数据库中读取数据并进行处理。这里使用了 hashCode 方法将表名转换为整数,然后根据分片参数判断是否需要处理。这种方式可以保证每张表的处理任务分布均匀,不会因为表名的特殊性导致某些分片项的负载过大。

    总结

    分片广播是 xxl-job 的一种任务类型,适用于一些需要并行执行的任务场景。在生产环境中,分片广播通常用于以下场景:

    1. 数据处理任务:例如对大量数据进行清洗、分析、转换等操作,可以将任务拆分成多个小任务,分布式地执行,提高任务的执行效率和可靠性。
    2. 分布式计算任务:例如对大规模数据进行机器学习、深度学习等计算,可以将计算任务拆分成多个小任务,分布式地执行,加速计算过程。
    3. 并发请求任务:例如对多个服务进行并发请求,可以将请求拆分成多个小请求,分布式地执行,提高请求的并发处理能力。

    分片广播适用于需要将一个任务拆分成多个小任务,分布式地执行的场景,可以提高任务的执行效率和可靠性,同时降低单个节点的负载压力。

  • 相关阅读:
    面试常问CAS和ABA问题,你懂了吗?
    解密代理技术:保障隐私与网络安全
    numpy常用乘法函数总结:np.dot()、np.multiply()、*、np.matmul()、@、np.prod()、np.outer()
    BUUCTF Web 极客大挑战 2019 EasySQL
    MySQL的主从复制
    【毕业设计】基于Stm32的人体心率脉搏无线监测系统 - 单片机 物联网
    使用JSON字符串生成Java实体类
    ElasticSearch Client体验
    北京十大律师事务所(排名榜单2022版,胜诉率靠前)
    KNN-K近邻算法(K-Nearest Neighbors)
  • 原文地址:https://blog.csdn.net/u011397981/article/details/132745762