Skip to content

静态分片

含义

将一个大的任务或者数据集分割成多个较小的部分来处理的方法。在 snail-job 中,静态分片任务是指将一个大任务拆分成多个小任务并发执行,每个小任务处理数据的一个子集,并且这个要处理的子集是通过事先页面配置的的静态参数来决定的。

场景

假设公司要对明文保存手机号的 User 表进行数据安全审查,自增 id 从 1 到 40000,通过 snail-job 的静态分片任务将这 4 万条数据按不同范围分片处理。

测试

测试目的
  • 验证每个节点接收到的分片参数是否是正确的
  • 验证某个节点执行失败批次状态是否为失败
测试代码
java
@Slf4j
@Component
@JobExecutor(name = "testSnailJobWithAnnotation")
public class TestSnailJobWithAnnotation {
@Autowired
    private Environment env;

    Map<String,String> dataMap = new HashMap<>(){{
        put("1","1");
        put("2","2");
        put("3","3");
        put("4","4");
        put("5","5");
        put("6","6");
        put("7","7");
        put("8","8");
        put("9","9");
    }};

    @JobExecutor(name = "testSnailJobWithAnnotation")
    public ExecuteResult testSnailJobWithAnnotation1(JobArgs jobArgs) throws InterruptedException {
        log.info("定时任务执行成功.参数值:{}", JSON.toJSONString(jobArgs));
        SnailJobLog.REMOTE.info("REMOTE日志.参数值:{}", JSON.toJSONString(jobArgs));
        SnailJobLog.REMOTE.info("REMOTE日志.当前节点{}", env.getProperty("server.port"));
        JSONObject jsonObject = JSON.parseObject(jobArgs.getJobParams().toString());

        // 获取 phones 数组
        JSONArray phonesArray = jsonObject.getJSONArray("phones");
        for (Object o : phonesArray) {
            SnailJobLog.REMOTE.info("处理手机号为{}的数据开始",o.toString());
            TimeUnit.SECONDS.sleep(2);
            SnailJobLog.REMOTE.info("处理手机号为{}的数据结束",o.toString());
        }
        return ExecuteResult.success("处理完成");
    }
}

idea启动多个节点配置

shell
server.port=web端口 spring.profiles.active=执行环境
-Dserver.port=9901 -Dspring.profiles.active=dev-one
-Dserver.port=9902 -Dspring.profiles.active=dev-two
-Dserver.port=9903 -Dspring.profiles.active=dev-three

同时启动3个节点

测试结果

目的一结果:所有节点接收参数正常,页面批次接收显示正常

目的二结果:当某一节点失败后,批次状态即为失败

结论

  • 静态分片任务是把大任务分为一个一个的小任务,交给客户端去执行。之所以前面要加一个静态这个定语,就是说你要事先定义好分片的范围。有静态就意味会有动态,这个在下面的章节中介绍。
  • 客户端代码通过jobArgs.getJobParams()获得事先分片好的参数内容,进行对应的逻辑处理。