欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!java
Spring相关文章:
Springboot-Cloudspring
前面写了一篇文章《经过例子讲解Spring Batch入门,优秀的批处理框架》讲解Spring Batch
入门,但要发挥它的做用,并行处理不能不了解。springboot
大多数状况下,单线程、单进程的Spring Batch
已经能知足你的需求。在咱们走向更复杂的特性以前,先看看简单的能不能用,Keep it Simple and Stupid
。微信
不过,当你肯定要使用并行处理时,Spring Batch
也提供了多种选择。总体上分为两大类:多线程
细分以下:框架
Step
(单进程)Steps
(单进程)光从名字看,很难理解它们之间的差异,咱们来一一介绍吧。ui
经过提供一个TaskExecutor
来执行,而TaskExecutor
是能够自定义的,咱们能够提供一个基于线程池的TaskExecutor
,则能够实现多线程处理。this
@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(); }
这个看起来跟第一个很像,其实彻底不同。它是多个steps
之间来并行处理。因此job
应该是能够分解为独立的step
,不是按一步一步的顺序处理,这样才能够并行执行。好比下面的例子,step1
和step2
合并成一个flow1
,而step3
为flow2
,flow1
与flow2
之间能够并行处理。线程
代码以下:code
@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"); }
在这种模式下,step
会被拆成多个Java
进程来处理,主程序与分块执行程序之间经过中间件来通讯。以下图所示:
由上图能够看出,读取只有一个进程Manager
,而处理进程Worker
则能够多个,因此适用于易读而难处理的场景。
远程分区
跟远程分块
容易混淆,但其实它们是不一样的。前面讲解的远程分块
是一个进程读,多个进程处理;而远程分区
是多个进程读,多个进程处理,多个进程写:
因此,远程分区
适用于容易有IO瓶颈的系统,由于它将读与写都拆到多个worker
进程中去了。远程分区
可使用中间件,如消息队列,也能够不用。它经过PartitionHandler
来进行分区处理,而Partitioner
则定义了如何进行分区。
本文介绍了Spring Batch
并行处理的四种模式,分别是多线程Step
、并行Steps
、远程分块、远程分区。前两种比较简单,给出代码例子;然后两种则复杂得多,特别是远程分区
模式,把IO
压力和业务处理压力都分解了,能大大提升整个流程的处理效率。后续咱们再专门讲解一下远程分区
吧。
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
多读书,多分享;多写做,多整理。