歡迎訪問南瓜慢說 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
壓力和業務處理壓力都分解了,能大大提升整個流程的處理效率。後續咱們再專門講解一下遠程分區
吧。
歡迎關注微信公衆號<南瓜慢說>,將持續爲你更新...
多讀書,多分享;多寫做,多整理。