前言
整個章節由淺入深了解Spring Batch,讓你掌握批處理利器。面對大批量數據毫無懼色。本章只做介紹,后面章節有代碼示例。好了,接下來是我們的主角Spring Batch。
1.1 背景介紹
1.1.1 誕生
開源社區一直把大部分注意力集中在web和SOA框架中,基於java的批處理框架確很少,因此一個標准的、可重用的批處理框架對我們來說很重要。先來說一下什么是批處理?在企業應用時,需要定期或者人工觸發的讀入大批量數據,然后完成相應的業務處理並進行歸檔。這類工作就成為批處理。
SpringSource和Accenture致力於通過合作來解決這種狀況,Accenture在實現批處理架構上有着豐富的產業實踐經驗,SpringSource則有深厚的技術開發經驗,兩者成為強大的合作伙伴,創造出高質量的、市場認可的企業級java解決方案。因此誕生了Spring Batch
1.1.2 為什么使用它?
Spring Batch作為Spring的子項目,是一款輕量級的綜合批處理框架,通過它可以構建出壯健的企業級批處理應用,因為基於Spring,所以開發者十分容易上手使用。SpringBatch不僅提供了統一的讀寫接口、豐富的任務處理方式、可重用的功能,還包括了日志,事務管理,任務統計、彈性處理等功能。使開發人員可以更多的關注業務處理過程。
Spring Batch不是一個調度框架,因為已經有非常好的企業級調度框架包括Quartz等,它只注重任務處理相關問題,如執行任務、事務、並發等,而不是提供調度功能。它是為了和調度程序一起完成任務而設計的。比如我們希望定期的執行大批量數據任務,那么可結合Quartz等來實現。
1.1.3 應用場景
大量文件處理是比較常見的企業級應用場景,比如你要做聚合支付,那么必定會有聚合賬單,如果每天有百萬甚至千萬級別的交易數據。那么將如何處理呢?如何進行海量數據的對賬成了難題。或者每天需要處理其他業務場景的大數據量的文件,最后將處理好的數據寫入數據庫中。
其實可以先不用想Spring Batch,如果沒有,我們如何開發?這里就需要一個框架需要以下幾點:
- 支持對多種數據源進行操作
- 能夠定義不同job之間的順序關系
- 能夠定義每個job的輸入和輸出數據操作
- 對異常輸入數據有校驗機制和彈性處理
- 支持job重跑等處理機制
這不就是一個批處理框架需要的基礎功能嗎?
1.2 Spring Batch架構
1.2.1 框架層次
Spring Batch分三層,應用層,核心層和基礎架構層。
應用層:開發人員使用Spring Batch編寫的所有批處理任務代碼
核心層:包含加載和控制批處理作業所需的核心類,Job,Step等類的實現
基礎架構層:包含通用的讀寫器和重試模塊
1.2.2 概念模型
下圖顯示了完整的概念模型,JobLauncher啟動Job,Job可以有多個Step組合,每一個Step由開發者自己編寫,可一把一個大Step分成多個小Step,完全看開發者意願。每一個Step對應一個ItemReader、ItemProcessor和ItemWriter。所有的批處理框架都可以抽象成最簡單的過程,讀取數據,處理數據,寫數據。所以Spring Batch提供了3個接口,ItemReader、ItemProcessor和ItemWriter。JobRepository則是記錄Job、Step和發起Job的執行信息等。
下圖為處理流程,reader讀,processor處理校驗數據,writer寫數據(入參是list,減少io次數)
1.3 處理原則
下面是一些處理原則,可參考
- 盡量使用公用模塊
- 盡量簡化操作,不要有復雜的業務邏輯。更不要處理一條數據還要調外部接口進行數據加工
- 盡可能少的IO操作
- 同一個批處理文件不要處理2次
- 盡可能壓力測試