pkslow.com 南瓜慢说

  • AllArticles
  • Container
  • Spring
  • Life
  • Cloud
  • Collections
  • About
  • GitHub

  • Search
Terraform101 English Terraform Middleware config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac Plan Stream MongoDB Spring DevOps JVM String Map Set List Performance Email Springboot JavaCollections ArrayList Java

大量数据也不在话下,Spring Batch并行处理四种模式初探

Created on: 2020-09-13 | Category: Springboot | 0 | View: 1289

1 前言

前面写了一篇文章《通过例子讲解Spring Batch入门,优秀的批处理框架》讲解Spring Batch入门,但要发挥它的作用,并行处理不能不了解。

2 四种模式

大多数情况下,单线程、单进程的Spring Batch已经能满足你的需求。在我们走向更复杂的特性之前,先看看简单的能不能用,Keep it Simple and Stupid。

不过,当你确定要使用并行处理时,Spring Batch也提供了多种选择。整体上分为两大类:

  • (1)单进程、多线程
  • (2)多进程

细分如下:

  • (1)多线程的Step(单进程)
  • (2)并行的Steps(单进程)
  • (3)远程分块(多进程)
  • (4)远程分区(多进程)

光从名字看,很难理解它们之间的差别,我们来一一介绍吧。

2.1 多线程的Step

通过提供一个TaskExecutor来执行,而TaskExecutor是可以自定义的,我们可以提供一个基于线程池的TaskExecutor,则可以实现多线程处理。

@Bean
public TaskExecutor taskExecutor(){
  return new SimpleAsyncTaskExecutor("spring_batch");
}

@Bean
public Step sampleStep(TaskExecutor taskExecutor) {
  return this.stepBuilderFactory.get("sampleStep")
    .<String, String>chunk(10)
    .reader(itemReader())
    .writer(itemWriter())
    .taskExecutor(taskExecutor)
    .build();
}

2.2 并行Steps

这个看起来跟第一个很像,其实完全不一样。它是多个steps之间来并行处理。所以job应该是可以分解为独立的step,不是按一步一步的顺序处理,这样才可以并行执行。比如下面的例子,step1和step2合并成一个flow1,而step3为flow2,flow1与flow2之间可以并行处理。

代码如下:

@Bean
public Job job() {
  return jobBuilderFactory.get("job")
    .start(splitFlow())
    .next(step4())
    .build()        //builds FlowJobBuilder instance
    .build();       //builds Job instance
}

@Bean
public Flow splitFlow() {
  return new FlowBuilder<SimpleFlow>("splitFlow")
    .split(taskExecutor())
    .add(flow1(), flow2())
    .build();
}

@Bean
public Flow flow1() {
  return new FlowBuilder<SimpleFlow>("flow1")
    .start(step1())
    .next(step2())
    .build();
}

@Bean
public Flow flow2() {
  return new FlowBuilder<SimpleFlow>("flow2")
    .start(step3())
    .build();
}

@Bean
public TaskExecutor taskExecutor(){
  return new SimpleAsyncTaskExecutor("spring_batch");
}

2.3 远程分块

在这种模式下,step会被拆成多个Java进程来处理,主程序与分块执行程序之间通过中间件来通信。如下图所示:

由上图可以看出,读取只有一个进程Manager,而处理进程Worker则可以多个,所以适用于易读而难处理的场景。

2.4 远程分区

远程分区跟远程分块容易混淆,但其实它们是不同的。前面讲解的远程分块是一个进程读,多个进程处理;而远程分区是多个进程读,多个进程处理,多个进程写:

所以,远程分区适用于容易有IO瓶颈的系统,因为它将读与写都拆到多个worker进程中去了。远程分区可以使用中间件,如消息队列,也可以不用。它通过PartitionHandler来进行分区处理,而Partitioner则定义了如何进行分区。

3 总结

本文介绍了Spring Batch并行处理的四种模式,分别是多线程Step、并行Steps、远程分块、远程分区。前两种比较简单,给出代码例子;而后两种则复杂得多,特别是远程分区模式,把IO压力和业务处理压力都分解了,能大大提高整个流程的处理效率。后续我们再专门讲解一下远程分区吧。


参考:

官网Scaling and Parallel Processing

官网externalizing-batch-process-execution


Code for all: GitHub

欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

file

Recommendations:
Cloud Native
Terraform
Container: Docker/Kubernetes
Spring Boot / Spring Cloud
Https
如何制定切实可行的计划并好好执行

  • Author 作者: LarryDpk 南瓜慢说
  • Link 链接: https://www.pkslow.com/archives/spring-batch-scaling
  • 版权声明: 本博客所有文章除特别声明外,不可转载!
# Terraform101 # English # Terraform # Middleware # config # Go # Private # Kubernetes # pkslow # Test # HTTPS # Redis # Docker # Mac # Plan # Stream # MongoDB # Spring # DevOps # JVM # String # Map # Set # List # Performance # Email # Springboot # JavaCollections # ArrayList # Java
Terraform101 English Terraform Middleware config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac Plan Stream MongoDB Spring DevOps JVM String Map Set List Performance Email Springboot JavaCollections ArrayList Java
Https双向验证与Springboot整合测试-人来人往我只认你
Springboot-WebFlux实现http重定向到https
  • Contents
  • Site Overview
南瓜慢说

南瓜慢说

多年Java开发,主要专注后端技术:Java/Spring/Springboot/微服务/大数据等。

多读书,多分享;多写作,多整理。

241 Posts
9 Categories
30 Tags
RSS
0%
© 2020 — 2022 南瓜慢说 pkslow The WebSite keeping alive:   粤ICP备20036375号