對于擴展性,框架提供的擴展能力包括如下的四種模式 :
Multithreaded Step 多線程執(zhí)行一個Step;
Parallel Step 通過多線程并行執(zhí)行多個Step;
Remote Chunking 在遠(yuǎn)端節(jié)點上執(zhí)行分布式Chunk操作;
Partitioning Step 對數(shù)據(jù)進(jìn)行分區(qū),并分開執(zhí)行;
我們先來看第一種的實現(xiàn)Multithreaded Step:

批處理框架在Job執(zhí)行時默認(rèn)使用單個線程完成任務(wù)的執(zhí)行,同時框架提供了線程池的支持(Multithreaded Step模式),可以在Step執(zhí)行時候進(jìn)行并行處理,這里的并行是指同一個Step使用線程池進(jìn)行執(zhí)行,同一個Step被并行的執(zhí)行。使用tasklet的屬性task-executor可以非常容易的將普通的Step變成多線程Step。
Multithreaded Step的實現(xiàn)示例:

需要注意的是Spring Batch框架提供的大部分的ItemReader、ItemWriter等操作都是線程不安全的。
可以通過擴展的方式顯現(xiàn)線程安全的Step。
下面為大家展示一個擴展的實現(xiàn):

需求:針對數(shù)據(jù)表的批量處理,實現(xiàn)線程安全的Step,并且支持重啟能力,即在執(zhí)行失敗點可以記錄批處理的狀態(tài)。
對于示例中的數(shù)據(jù)庫讀取組件JdbcCursorItemReader,在設(shè)計數(shù)據(jù)庫表時,在表中增加一個字段Flag,用于標(biāo)識當(dāng)前的記錄是否已經(jīng)讀取并處理成功,如果處理成功則標(biāo)識Flag=true,等下次重新讀取的時候,對于已經(jīng)成功讀取且處理成功的記錄直接跳過處理。
Multithreaded Step(多線程步)提供了多個線程執(zhí)行一個Step的能力,但這種場景在實際的業(yè)務(wù)中使用的并不是非常多。
更多的業(yè)務(wù)場景是Job中不同的Step沒有明確的先后順序,可以在執(zhí)行期并行的執(zhí)行。
Parallel Step:提供單個節(jié)點橫向擴展的能力

使用場景:Step A、Step B兩個作業(yè)步由不同的線程執(zhí)行,兩者均執(zhí)行完畢后,Step C才會被執(zhí)行。
框架提供了并行Step的能力??梢酝ㄟ^Split元素來定義并行的作業(yè)流,并制定使用的線程池。
Parallel Step模式的執(zhí)行效果如下:

每個作業(yè)步并行處理不同的記錄,示例中三個作業(yè)步,處理同一張表中的不同數(shù)據(jù)。
并行Step提供了在一個節(jié)點上橫向處理,但隨著作業(yè)處理量的增加,有可能一臺節(jié)點無法滿足Job的處理,此時我們可以采用遠(yuǎn)程Step的方式將多個機器節(jié)點組合起來完成一個Job的處理。
Remote Chunking:遠(yuǎn)程Step技術(shù)本質(zhì)上是將對Item讀、寫的處理邏輯進(jìn)行分離;通常情況下讀的邏輯放在一個節(jié)點進(jìn)行操作,將寫操作分發(fā)到另外的節(jié)點執(zhí)行。

遠(yuǎn)程分塊是一個把step進(jìn)行技術(shù)分割的工作,不需要對處理數(shù)據(jù)的結(jié)構(gòu)有明確了解。
任何輸入源能夠使用單進(jìn)程讀取并在動態(tài)分割后作為"塊"發(fā)送給遠(yuǎn)程的工作進(jìn)程。
遠(yuǎn)程進(jìn)程實現(xiàn)了監(jiān)聽者模式,反饋請求、處理數(shù)據(jù)最終將處理結(jié)果異步返回。請求和返回之間的傳輸會被確保在發(fā)送者和單個消費者之間。
在Master節(jié)點,作業(yè)步負(fù)責(zé)讀取數(shù)據(jù),并將讀取的數(shù)據(jù)通過遠(yuǎn)程技術(shù)發(fā)送到指定的遠(yuǎn)端節(jié)點上,進(jìn)行處理,處理完畢后Master負(fù)責(zé)回收Remote端執(zhí)行的情況。
在Spring Batch框架中通過兩個核心的接口來完成遠(yuǎn)程Step的任務(wù),分別是ChunkProvider與ChunkProcessor。
ChunkProvider:根據(jù)給定的ItemReader操作產(chǎn)生批量的Chunk操作;
ChunkProcessor:負(fù)責(zé)獲取ChunkProvider產(chǎn)生的Chunk操作,執(zhí)行具體的寫邏輯;
Spring Batch中對遠(yuǎn)程Step沒有默認(rèn)的實現(xiàn),但我們可以借助SI或者AMQP實現(xiàn)來實現(xiàn)遠(yuǎn)程通訊能力。