01.SpringBatch 介紹

SpringBatch概述

Spring Batch是一個輕量級的、完善的批處理框架,旨在幫助企業建立健壯、高效的批處理應用。Spring BatchSpring的一個子項目,使用Java語言并基于Spring框架為基礎開發,使得已經使用Spring框架的開發者或者企業更容易訪問和利用企業服務。

Spring Batch提供了大量可重用的組件,包括日志、追蹤、事物、任務作業統計、任務重啟、跳過、重復、資源管理。對于大數據量和高性能的批處理任務,Spring Batch 同樣提供了高級功能和特性來支持,比如分區功能、遠程功能??傊?,通過Spring Batch 能夠支持簡單的、復雜的和大數據量的批處理作業。

Spring Batch是一個批處理應用框架,不是調度框架,但需要和調度框架合作來構建完成批處理任務。它只關注批處理任務相關的問題,如事物、并發、監控、執行等,并不提供相應的調度功能。如果需要使用調度框架,在商業軟件和開源軟件中已經有很多優秀的企業級調度框架(如;Quartz、TivoliControl-MCron等)可以使用。

使用場景

一般的典型批處理程序:

  • 從數據庫,文件或隊列中讀取大量記錄。

  • 以某種方式處理數據。

  • 以修改的形式寫回數據。

Spring Batch自動執行此基本批處理迭代,提供處理類似事務的功能,通常在脫機環境中處理,無需任何用戶交互。批處理作業是大多數IT項目的一部分,Spring Batch是唯一提供強大的企業級解決方案的開源框架。

業務場景

定期提交批處理

  • 并發批處理:并行處理作業

  • 分階段的企業消息驅動處理

  • 大規模并行批處理

  • 失敗后手動或預定重啟

  • 依賴步驟的順序處理(使用擴展的toworkflow驅動批次)

  • 部分處理:跳過記錄(例如,回滾時)

  • 整批交易,適用于批量較小或現有存儲過程/腳本的情況

技術目標

  • 批處理開發人員使用Spring編程模型:專注于業務邏輯,讓框架負責基礎架構。

  • 清楚地分離基礎架構,批處理執行環境和批處理應用程序之間的關注點。

  • 提供通用的核心執行服務作為所有項目可以實現的接口。

  • 提供可以“開箱即用”使用的核心執行接口的簡單和默認實現。

  • 通過在所有層中利用spring框架,易于配置,定制和擴展服務。

  • 所有現有核心服務都應易于更換或擴展,而不會對基礎架構層產生任何影響。

  • 提供一個簡單的部署模型,使用Maven構建的架構JAR與應用程序完全分離。

Spring Batch 體系結構

Spring Batch的設計具有可擴展性和多樣化的最終用戶群。下圖顯示了支持最終用戶開發人員的可擴展性和易用性的分層體系結構。

Spring Batch分層架構

這種分層架構突出了三個主要的高級組件:應用程序,核心和基礎架構。該應用程序包含開發人員使用Spring Batch編寫的所有批處理作業和自定義代碼。Batch Core包含啟動和控制批處理作業所需的核心運行時類。它包括實現 JobLauncher,JobStep。ApplicationCore都建立在通用基礎架構之上。此基礎結構包含常見的讀取器和編寫器和服務(例如RetryTemplate),應用程序開發人員(讀取器和編寫器,如ItemReaderItemWriter)以及核心框架本身(Retry,它是自己的庫)都使用它們。

一般Batch原則和指南

在構建批處理解決方案時,應考慮以下關鍵原則,指南和一般注意事項。

  • 請記住,批處理體系結構通常會影響在線體系結構,反之亦然。盡可能使用通用構建塊來設計體系結構和環境.

  • 盡可能簡化并避免在單批應用程序中構建復雜的邏輯結構。

  • 保持數據的處理和存儲物理上緊密相連(換句話說,將數據保存在處理過程中)。

  • 最大限度地減少系統資源的使用,尤其是I/O. 在內部存儲器中執行盡可能多的操作。

  • 查看應用程序I/O(分析SQL語句)以確保避免不必要的物理I/O. 特別是,需要尋找以下四個常見缺陷:
    ① 當數據可以被讀取一次并緩存或保存在工作存儲中時,讀取每個事務的數據。
    ②重新讀取先前在同一事務中讀取數據的事務的數據
    ③導致不必要的表或索引掃描。
    ④未在SQL語句的WHERE子句中指定鍵值。

  • 不要在批處理中執行兩次操作。例如,如果您需要數據匯總以用于報告目的,則應該(如果可能)在最初處理數據時遞增存儲的總計,因此您的報告應用程序不必重新處理相同的數據。

  • 在批處理應用程序開始時分配足夠的內存,以避免在此過程中進行耗時的重新分配。

  • 總是假設數據完整性最差。插入適當的檢查和記錄驗證以維護數據完整性。

  • 盡可能實現內部驗證的校驗和。例如,平面文件應該有一個預告片記錄,告訴文件中的記錄總數和關鍵字段的匯總。

  • 在具有真實數據量的類似生產的環境中盡可能早地計劃和執行壓力測試。

  • 在大批量系統中,備份可能具有挑戰性,特別是如果系統以24*7為基礎同時在線運行。數據庫備份通常在在線設計中得到很好的處理,但文件備份應該被視為同樣重要。如果系統依賴于平面文件,則文件備份過程不僅應該到位并記錄在案,而且應該定期進行測試。

批處理策略

為了幫助設計和實現批處理系統,應該以樣本結構圖和代碼shell的形式向設計人員和程序員提供基本的批處理應用程序構建塊和模式。在開始設計批處理作業時,應將業務邏輯分解為一系列步驟,這些步驟可使用以下標準構建塊實現:

  • 轉換應用程序:對于由外部系統提供或生成的每種類型的文件,必須創建轉換應用程序以將提供的事務記錄轉換為處理所需的標準格式。此類批處理應用程序可以部分或全部由轉換實用程序模塊組成(請參閱基本批處理服務)。

  • 驗證應用程序:驗證應用程序確保所有輸入/輸出記錄正確且一致。驗證通常基于文件頭和預告片,校驗和和驗證算法以及記錄級交叉檢查。

  • 驗證應用程序:驗證應用程序確保所有輸入/輸出記錄正確且一致。驗證通常基于文件頭和預告片,校驗和和驗證算法以及記錄級交叉檢查。

  • 提取應用程序:從數據庫或輸入文件中讀取一組記錄,根據預定義規則選擇記錄,并將記錄寫入輸出文件的應用程序。

  • 提取/更新應用程序:從數據庫或輸入文件中讀取記錄并對由每個輸入記錄中的數據驅動的數據庫或輸出文件進行更改的應用程序。

  • 處理和更新應用程序:從提取或驗證應用程序對輸入事務執行處理的應用程序。處理通常涉及讀取數據庫以獲取處理所需的數據,可能更新數據庫并創建輸出處理的記錄。

  • 處理和更新應用程序:從提取或驗證應用程序對輸入事務執行處理的應用程序。處理通常涉及讀取數據庫以獲取處理所需的數據,可能更新數據庫并創建輸出處理的記錄。

  • 此外,應為無法使用前面提到的構建塊構建的業務邏輯提供基本應用程序shell。

除了主要構建塊之外,每個應用程序還可以使用一個或多個標準實用程序步驟,例如:

  • 排序:讀取輸入文件并生成輸出文件的程序,其中記錄已根據記錄中的排序鍵字段重新排序。排序通常由標準系統實用程序執行。

  • 拆分:一個程序,它讀取單個輸入文件,并根據字段值將每個記錄寫入多個輸出文件之一??梢酝ㄟ^參數驅動的標準系統實用程序來定制或執行拆分。

  • 合并:一種程序,它從多個輸入文件中讀取記錄,并生成一個輸出文件,其中包含來自輸??入文件的組合數據??梢酝ㄟ^參數驅動的標準系統實用程序來定制或執行合并。

  • 批量應用程序還可以按其輸入源進行分類:

  • 數據庫驅動的應用程序由從數據庫檢索的行或值驅動。

  • 文件驅動的應用程序由從文件中檢索的記錄或值驅動。

  • 消息驅動的應用程序由從消息隊列中檢索的消息驅動。

任何批處理系統的基礎都是處理策略。影響策略選擇的因素包括:估計的批處理系統容量,與在線系統或其他批處理系統的并發性,可用的批處理窗口。(請注意,隨著越來越多的企業希望全天候運行,明確的批處理窗口正在消失)。

批處理的典型處理選項是(按實現復雜度的遞增順序):

  • 在離線模式下批處理窗口期間的正常處理。

  • 并發批處理或在線處理。

  • 并行處理許多不同的批處理運行或作業。

  • 分區(同時處理同一作業的許多實例)。

  • 上述選項的組合。

商業調度程序可以支持部分或全部這些選項。

以下部分更詳細地討論了這些處理選項。重要的是要注意,根據經驗,批處理采用的提交和鎖定策略取決于所執行的處理類型,并且在線鎖定策略也應使用相同的原則。因此,在設計整體架構時,批處理架構不能簡單地成為事后的想法。

鎖定策略可以是僅使用普通數據庫鎖或在體系結構中實現其他自定義鎖定服務。鎖定服務將跟蹤數據庫鎖定(例如,通過將必要信息存儲在專用db表中)并對請求db操作的應用程序提供或拒絕權限。此架構還可以實現重試邏輯,以避免在發生鎖定情況時中止批處理作業。

1.批處理窗口中的正常處理對于在單獨的批處理窗口中運行的簡單批處理進程,其中在線用戶或其他批處理過程不需要更新的數據,并發性不是問題,可以在批次運行結束。

在大多數情況下,更強大的方法更合適。請記住,批量系統隨著時間的推移有增長的趨勢,無論是復雜性還是處理的數據量。如果沒有鎖定策略并且系統仍然依賴于單個提交點,則修改批處理程序可能會很痛苦。因此,即使使用最簡單的批處理系統,也需要考慮重啟恢復選項的提交邏輯以及本節后面描述的更復雜情況的信息。

2.并發批處理或在線處理批處理應用程序處理可由在線用戶同時更新的數據不應鎖定在線用戶可能需要的任何數據(數據庫或文件中)幾秒鐘。此外,應在每次交易結束時將更新提交到數據庫。這最小化了其他進程不可用的數據部分以及數據不可用的時間。

最小化物理鎖定的另一個選項是使用樂觀鎖定模式或悲觀鎖定模式實現邏輯行級鎖定。

  • 樂觀鎖定假設記錄爭用的可能性很小。它通常意味著在批處理和聯機處理同時使用的每個數據庫表中插入時間戳列。當應用程序提取行進行處理時,它還會獲取時間戳。當應用程序嘗試更新已處理的行時,更新將使用WHERE子句中的原始時間戳。如果時間戳匹配,則更新數據和時間戳。如果時間戳不匹配,則表示另一個應用程序在獲取和更新嘗試之間更新了同一行。因此,無法執行更新。

  • 悲觀鎖定是任何鎖定策略,假設存在記錄爭用的高可能性,因此需要在檢索時獲得物理或邏輯鎖定。一種悲觀邏輯鎖定使用數據庫表中的專用鎖定列。當應用程序檢索要更新的行時,它會在鎖定列中設置一個標志。使用該標志后,嘗試檢索同一行的其他應用程序在邏輯上會失敗。當設置標志的應用程序更新該行時,它還會清除該標志,從而使該行能夠被其他應用程序檢索。請注意,必須在初始提取和標志設置之間保持數據的完整性,例如使用數據庫鎖(例如SELECT FOR UPDATE)。另請注意,此方法的缺點與物理鎖定相同,除了管理構建超時機制更容易,如果用戶在鎖定記錄時進入午餐,則會釋放鎖定。

這些模式不一定適合批處理,但它們可能用于并發批處理和聯機處理(例如在數據庫不支持行級鎖定的情況下)。作為一般規則,樂觀鎖定更適合在線應用程序,而悲觀鎖定更適合批處理應用程序。每當使用邏輯鎖定時,必須對訪問受邏輯鎖保護的數據實體的所有應用程序使用相同的方案。

請注意,這兩種解決方案僅解決鎖定單個記錄的問題。通常,我們可能需要鎖定邏輯上相關的記錄組。使用物理鎖,您必須非常小心地管理這些,以避免潛在的死鎖。對于邏輯鎖,通常最好構建一個邏輯鎖管理器,該管理器了解您要保護的邏輯記錄組,并確保鎖是連貫的和非死鎖的。此邏輯鎖管理器通常使用自己的表進行鎖管理,爭用報告,超時機制和其他問題。

3.并行處理并行處理允許多個批處理運行或作業并行運行,以最大限度地減少總批處理時間。只要作業不共享相同的文件,db-tables或索引空間,這就不是問題。如果他們這樣做,則應使用分區數據實現此服務。另一種選擇是通過使用控制表來構建用于維護相互依賴性的體系結構模塊??刂票響總€共享資源的行以及它是否正由應用程序使用。然后,批處理體系結構或并行作業中的應用程序將從該表中檢索信息,以確定它是否可以訪問它所需的資源。

如果數據訪問不是問題,則可以通過使用額外的線程并行處理來實現并行處理。在大型機環境中,傳統上使用并行作業類,以確保所有進程有足夠的CPU時間。無論如何,該解決方案必須足夠強大,以確保所有正在運行的進程的時間片。

并行處理中的其他關鍵問題包括負載平衡和一般系統資源(如文件,數據庫緩沖池等)的可用性。另請注意,控制表本身很容易成為關鍵資源。

4.分區使用分區允許多個版本的大批量應用程序同時運行。這樣做的目的是減少處理長批處理作業所需的時間。可以成功分區的進程是可以拆分輸入文件和/或對主數據庫表進行分區以允許應用程序針對不同數據集運行的進程。

此外,必須將分區的進程設計為僅處理其分配的數據集。分區架構必須與數據庫設計和數據庫分區策略緊密相關。請注意,數據庫分區并不一定意味著數據庫的物理分區,盡管在大多數情況下這是可取的。下圖說明了分區方法:


分區過程

該體系結構應足夠靈活,以允許動態配置分區數。應考慮自動和用戶控制的配置。自動配置可以基于諸如輸入文件大小和輸入記錄的數量之類的參數。

4.1分區方法選擇分區方法必須根據具體情況進行。以下列表描述了一些可能的分區方法:

1.記錄集的固定和均勻分解

這涉及將輸入記錄集分成偶數個部分(例如,10,其中每個部分恰好是整個記錄集的十分之一)。然后,每個部分由批/提取應用程序的一個實例處理。

為了使用這種方法,需要預處理來分割記錄集。此拆分的結果將是下限和上限放置編號,可用作批處理/提取應用程序的輸入,以便將其處理限制為僅其部分。

預處理可能是一個很大的開銷,因為它必須計算和確定記錄集的每個部分的邊界。

2.按鍵列分解

這涉及拆分由鍵列設置的輸入記錄,并將每個鍵的數據分配給批處理實例。為了實現這一點,列值可以是:

  • 通過分區表分配給批處理實例。

  • 通過值的一部分(例如0000-0999,1000-1999等)分配給批處理實例。

在選項1下,添加新值意味著手動重新配置批處理/提取以確保將新值添加到特定實例。

在選項2下,這可確保通過批處理作業的實例覆蓋所有值。但是,一個實例處理的值的數量取決于列值的分布(0000-0999范圍內可能有大量位置,1000-1999范圍內可能很少)。在此選項下,數據范圍應設計為考慮分區。

在這兩個選項下,無法實現記錄到批處理實例的最佳均勻分布。沒有使用批處理實例數的動態配置。

3.按意見分解

這種方法基本上是由關鍵列分解,但在數據庫級別上。它涉及將記錄集分解為視圖。批處理應用程序的每個實例在處理過程中都使用這些視圖。分解是通過對數據進行分組來完成的。

使用此選項,必須將批處理應用程序的每個實例配置為命中特定視圖(而不是主表)。此外,通過添加新數據值,必須將這組新數據包含在視圖中。沒有動態配置功能,因為實例數量的更改會導致視圖發生更改。

4.增加處理指標

這涉及向輸入表添加新列,該列充當指示符。作為預處理步驟,所有指標都標記為未處理。在批處理應用程序的記錄提取階段,讀取記錄的條件是該記錄被標記為未處理,并且一旦讀取它們(帶鎖定),它們就被標記為正在處理中。完成該記錄后,指標將更新為完成或錯誤。批處理應用程序的許多實例可以在沒有更改的情況下啟動,因為附加列確保僅處理一次記錄。在“完成時,指標被標記為完成”的順序中的一兩句話。)

使用此選項,表上的I / O會動態增加。在更新批處理應用程序的情況下,這種影響會減少,因為無論如何都必須進行寫入。

5.將表提取到平面文件

這涉及將表提取到文件中。然后,可以將此文件拆分為多個段,并將其用作批處理實例的輸入。

使用此選項,將表提取到文件中并將其拆分的額外開銷可能會抵消多分區的影響。可以通過更改文件拆分腳本來實現動態配置。

6.使用哈希柱

此方案涉及向用于檢索驅動程序記錄的數據庫表添加哈希列(鍵/索引)。此哈希列具有一個指示器,用于確定批處理應用程序的哪個實例處理此特定行。例如,如果要啟動三個批處理實例,則指示符“A”標記要由實例1處理的行,“B”的指示符標記要由實例2處理的行,以及指示符“C” '標記了實例3處理的行。

然后,用于檢索記錄的過程將有一個附加WHERE子句來選擇由特定指示符標記的所有行。此表中的插入將涉及添加標記字段,該字段將默認為其中一個實例(例如“A”)。

將使用簡單的批處理應用程序來更新指示符,例如在不同實例之間重新分配負載。當添加了足夠多的新行時,可以運行此批處理(除批處理窗口外的任何時間)以將新行重新分發到其他實例。

批處理應用程序的其他實例僅需要運行前面段落中所述的批處理應用程序,以重新分配指示符以使用新的實例數。

4.2數據庫和應用程序設計原則

支持使用鍵列方法針對分區數據庫表運行的多分區應用程序的體系結構應包括用于存儲分區參數的中央分區存儲庫。這提供了靈活性并確保了可維護性。存儲庫通常由單個表組成,稱為分區表。

存儲在分區表中的信息是靜態的,通常應由DBA維護。該表應包含多行分區應用程序的每個分區的一行信息。該表應包含程序ID代碼,分區號(分區的邏輯ID),此分區的db鍵列的低值以及此分區的db鍵列的高值。

在程序啟動時,id應該從體系結構(特別是從Control Processing Tasklet)將程序和分區號傳遞給應用程序。如果使用鍵列方法,則使用這些變量來讀取分區表,以確定應用程序要處理的數據范圍。此外,在整個處理過程中必須使用分區號:

  • 添加到輸出文件/數據庫更新,以使合并過程正常工作。

  • 向批處理日志報告正常處理,并向架構錯誤處理程序報告任何錯誤。

4.3盡量減少死鎖

當應用程序并行運行或分區時,可能會發生數據庫資源爭用和死鎖。作為數據庫設計的一部分,數據庫設計團隊盡可能地消除潛在的爭用情況至關重要。

此外,開發人員必須確保數據庫索引表的設計時考慮到死鎖和性能。

管理或體系結構表中經常出現死鎖或熱點,例如日志表,控制表和鎖定表。還應考慮到這些問題的影響。實際壓力測試對于識別架構中可能存在的瓶頸至關重要。

為了最大限度地減少沖突對數據的影響,架構應在附加到數據庫或遇到死鎖時提供等待和重試間隔等服務。這意味著內置機制對某些數據庫返回代碼作出反應,而不是發出立即錯誤,等待預定的時間并重試數據庫操作。

4.4參數傳遞和驗證

分區架構應該對應用程序開發人員相對透明。該體系結構應執行與以分區模式運行應用程序相關的所有任務,包括:

  • 在應用程序啟動之前檢索分區參數。

  • 在應用程序啟動之前驗證分區參數。

  • 在啟動時將參數傳遞給應用程序。

驗證應包括檢查以確保:

  • 該應用程序有足夠的分區來覆蓋整個數據范圍。

  • 分區之間沒有間隙。

如果數據庫已分區,則可能需要進行一些額外的驗證,以確保單個分區不跨越數據庫分區。

此外,該體系結構應考慮分區的合并。關鍵問題包括:

  • 在進入下一個工作步驟之前,是否必須完成所有分區?

  • 如果其中一個分區中止會發生什么?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容