SpringBatch概述
Spring Batch
是一個輕量級的史辙、完善的批處理框架佩伤,旨在幫助企業(yè)建立健壯生巡、高效的批處理應(yīng)用。Spring Batch
是Spring
的一個子項目甸陌,使用Java
語言并基于Spring
框架為基礎(chǔ)開發(fā)盐股,使得已經(jīng)使用Spring
框架的開發(fā)者或者企業(yè)更容易訪問和利用企業(yè)服務(wù)疯汁。
Spring Batch
提供了大量可重用的組件,包括日志谤碳、追蹤估蹄、事物沫换、任務(wù)作業(yè)統(tǒng)計讯赏、任務(wù)重啟冷尉、跳過雀哨、重復(fù)私爷、資源管理衬浑。對于大數(shù)據(jù)量和高性能的批處理任務(wù)工秩,Spring Batc
h 同樣提供了高級功能和特性來支持进统,比如分區(qū)功能螟碎、遠(yuǎn)程功能〖蠡海總之尔崔,通過Spring Batch
能夠支持簡單的褥民、復(fù)雜的和大數(shù)據(jù)量的批處理作業(yè)消返。
Spring Batch
是一個批處理應(yīng)用框架,不是調(diào)度框架宇攻,但需要和調(diào)度框架合作來構(gòu)建完成批處理任務(wù)逞刷。它只關(guān)注批處理任務(wù)相關(guān)的問題妻熊,如事物扔役、并發(fā)、監(jiān)控坯钦、執(zhí)行等婉刀,并不提供相應(yīng)的調(diào)度功能。如果需要使用調(diào)度框架溯街,在商業(yè)軟件和開源軟件中已經(jīng)有很多優(yōu)秀的企業(yè)級調(diào)度框架(如呈昔;Quartz
友绝、Tivoli
迁客、Control-M
掷漱、Cron
等)可以使用。
使用場景
一般的典型批處理程序:
從數(shù)據(jù)庫衔统,文件或隊列中讀取大量記錄锦爵。
以某種方式處理數(shù)據(jù)奥裸。
以修改的形式寫回數(shù)據(jù)湾宙。
Spring Batch自動執(zhí)行此基本批處理迭代,提供處理類似事務(wù)的功能埠啃,通常在脫機(jī)環(huán)境中處理,無需任何用戶交互知押。批處理作業(yè)是大多數(shù)IT項目的一部分,Spring Batch是唯一提供強(qiáng)大的企業(yè)級解決方案的開源框架罢绽。
業(yè)務(wù)場景
定期提交批處理
并發(fā)批處理:并行處理作業(yè)
分階段的企業(yè)消息驅(qū)動處理
大規(guī)模并行批處理
失敗后手動或預(yù)定重啟
依賴步驟的順序處理(使用擴(kuò)展的toworkflow驅(qū)動批次)
部分處理:跳過記錄(例如良价,回滾時)
整批交易明垢,適用于批量較小或現(xiàn)有存儲過程/腳本的情況
技術(shù)目標(biāo)
批處理開發(fā)人員使用Spring編程模型:專注于業(yè)務(wù)邏輯市咽,讓框架負(fù)責(zé)基礎(chǔ)架構(gòu)施绎。
清楚地分離基礎(chǔ)架構(gòu)谷醉,批處理執(zhí)行環(huán)境和批處理應(yīng)用程序之間的關(guān)注點。
提供通用的核心執(zhí)行服務(wù)作為所有項目可以實現(xiàn)的接口抖单。
提供可以“開箱即用”使用的核心執(zhí)行接口的簡單和默認(rèn)實現(xiàn)臭猜。
通過在所有層中利用spring框架押蚤,易于配置揽碘,定制和擴(kuò)展服務(wù)雳刺。
所有現(xiàn)有核心服務(wù)都應(yīng)易于更換或擴(kuò)展,而不會對基礎(chǔ)架構(gòu)層產(chǎn)生任何影響本昏。
提供一個簡單的部署模型涌穆,使用Maven構(gòu)建的架構(gòu)JAR與應(yīng)用程序完全分離宿稀。
Spring Batch 體系結(jié)構(gòu)
Spring Batch的設(shè)計具有可擴(kuò)展性和多樣化的最終用戶群。下圖顯示了支持最終用戶開發(fā)人員的可擴(kuò)展性和易用性的分層體系結(jié)構(gòu)矮烹。
這種分層架構(gòu)突出了三個主要的高級組件:應(yīng)用程序奉狈,核心和基礎(chǔ)架構(gòu)嘹吨。該應(yīng)用程序包含開發(fā)人員使用Spring Batch
編寫的所有批處理作業(yè)和自定義代碼蟀拷。Batch Core
包含啟動和控制批處理作業(yè)所需的核心運行時類萍聊。它包括實現(xiàn) JobLauncher
寿桨,Job
和Step
亭螟。Application
和Core
都建立在通用基礎(chǔ)架構(gòu)之上。此基礎(chǔ)結(jié)構(gòu)包含常見的讀取器和編寫器和服務(wù)(例如RetryTemplate
)墨微,應(yīng)用程序開發(fā)人員(讀取器和編寫器翘县,如ItemReader
和ItemWriter
)以及核心框架本身(Retry
锈麸,它是自己的庫)都使用它們牺蹄。
一般Batch原則和指南
在構(gòu)建批處理解決方案時,應(yīng)考慮以下關(guān)鍵原則匿刮,指南和一般注意事項。
請記住训措,批處理體系結(jié)構(gòu)通常會影響在線體系結(jié)構(gòu)绩鸣,反之亦然呀闻。盡可能使用通用構(gòu)建塊來設(shè)計體系結(jié)構(gòu)和環(huán)境.
盡可能簡化并避免在單批應(yīng)用程序中構(gòu)建復(fù)雜的邏輯結(jié)構(gòu)。
保持?jǐn)?shù)據(jù)的處理和存儲物理上緊密相連(換句話說蓖康,將數(shù)據(jù)保存在處理過程中)蒜焊。
最大限度地減少系統(tǒng)資源的使用泳梆,尤其是I/O. 在內(nèi)部存儲器中執(zhí)行盡可能多的操作优妙。
查看應(yīng)用程序I/O(分析SQL語句)以確保避免不必要的物理I/O. 特別是憎账,需要尋找以下四個常見缺陷:
① 當(dāng)數(shù)據(jù)可以被讀取一次并緩存或保存在工作存儲中時鼠哥,讀取每個事務(wù)的數(shù)據(jù)朴恳。
②重新讀取先前在同一事務(wù)中讀取數(shù)據(jù)的事務(wù)的數(shù)據(jù)
③導(dǎo)致不必要的表或索引掃描于颖。
④未在SQL語句的WHERE子句中指定鍵值。不要在批處理中執(zhí)行兩次操作做入。例如竟块,如果您需要數(shù)據(jù)匯總以用于報告目的浪秘,則應(yīng)該(如果可能)在最初處理數(shù)據(jù)時遞增存儲的總計耸携,因此您的報告應(yīng)用程序不必重新處理相同的數(shù)據(jù)。
在批處理應(yīng)用程序開始時分配足夠的內(nèi)存狈谊,以避免在此過程中進(jìn)行耗時的重新分配河劝。
總是假設(shè)數(shù)據(jù)完整性最差丧裁。插入適當(dāng)?shù)臋z查和記錄驗證以維護(hù)數(shù)據(jù)完整性煎娇。
盡可能實現(xiàn)內(nèi)部驗證的校驗和缓呛。例如杭隙,平面文件應(yīng)該有一個預(yù)告片記錄痰憎,告訴文件中的記錄總數(shù)和關(guān)鍵字段的匯總铣耘。
在具有真實數(shù)據(jù)量的類似生產(chǎn)的環(huán)境中盡可能早地計劃和執(zhí)行壓力測試蜗细。
在大批量系統(tǒng)中怒详,備份可能具有挑戰(zhàn)性昆烁,特別是如果系統(tǒng)以24*7為基礎(chǔ)同時在線運行静尼。數(shù)據(jù)庫備份通常在在線設(shè)計中得到很好的處理茅郎,但文件備份應(yīng)該被視為同樣重要。如果系統(tǒng)依賴于平面文件薪鹦,則文件備份過程不僅應(yīng)該到位并記錄在案惯豆,而且應(yīng)該定期進(jìn)行測試楷兽。
批處理策略
為了幫助設(shè)計和實現(xiàn)批處理系統(tǒng)地熄,應(yīng)該以樣本結(jié)構(gòu)圖和代碼shell的形式向設(shè)計人員和程序員提供基本的批處理應(yīng)用程序構(gòu)建塊和模式。在開始設(shè)計批處理作業(yè)時芯杀,應(yīng)將業(yè)務(wù)邏輯分解為一系列步驟端考,這些步驟可使用以下標(biāo)準(zhǔn)構(gòu)建塊實現(xiàn):
轉(zhuǎn)換應(yīng)用程序:對于由外部系統(tǒng)提供或生成的每種類型的文件,必須創(chuàng)建轉(zhuǎn)換應(yīng)用程序以將提供的事務(wù)記錄轉(zhuǎn)換為處理所需的標(biāo)準(zhǔn)格式揭厚。此類批處理應(yīng)用程序可以部分或全部由轉(zhuǎn)換實用程序模塊組成(請參閱基本批處理服務(wù))却特。
驗證應(yīng)用程序:驗證應(yīng)用程序確保所有輸入/輸出記錄正確且一致。驗證通沉衙鳎基于文件頭和預(yù)告片,校驗和和驗證算法以及記錄級交叉檢查太援。
驗證應(yīng)用程序:驗證應(yīng)用程序確保所有輸入/輸出記錄正確且一致闽晦。驗證通常基于文件頭和預(yù)告片提岔,校驗和和驗證算法以及記錄級交叉檢查仙蛉。
提取應(yīng)用程序:從數(shù)據(jù)庫或輸入文件中讀取一組記錄,根據(jù)預(yù)定義規(guī)則選擇記錄碱蒙,并將記錄寫入輸出文件的應(yīng)用程序捅儒。
提取/更新應(yīng)用程序:從數(shù)據(jù)庫或輸入文件中讀取記錄并對由每個輸入記錄中的數(shù)據(jù)驅(qū)動的數(shù)據(jù)庫或輸出文件進(jìn)行更改的應(yīng)用程序。
處理和更新應(yīng)用程序:從提取或驗證應(yīng)用程序?qū)斎胧聞?wù)執(zhí)行處理的應(yīng)用程序。處理通常涉及讀取數(shù)據(jù)庫以獲取處理所需的數(shù)據(jù)巧还,可能更新數(shù)據(jù)庫并創(chuàng)建輸出處理的記錄鞭莽。
處理和更新應(yīng)用程序:從提取或驗證應(yīng)用程序?qū)斎胧聞?wù)執(zhí)行處理的應(yīng)用程序。處理通常涉及讀取數(shù)據(jù)庫以獲取處理所需的數(shù)據(jù)麸祷,可能更新數(shù)據(jù)庫并創(chuàng)建輸出處理的記錄澎怒。
此外,應(yīng)為無法使用前面提到的構(gòu)建塊構(gòu)建的業(yè)務(wù)邏輯提供基本應(yīng)用程序shell阶牍。
除了主要構(gòu)建塊之外喷面,每個應(yīng)用程序還可以使用一個或多個標(biāo)準(zhǔn)實用程序步驟,例如:
排序:讀取輸入文件并生成輸出文件的程序走孽,其中記錄已根據(jù)記錄中的排序鍵字段重新排序惧辈。排序通常由標(biāo)準(zhǔn)系統(tǒng)實用程序執(zhí)行。
拆分:一個程序磕瓷,它讀取單個輸入文件盒齿,并根據(jù)字段值將每個記錄寫入多個輸出文件之一±常可以通過參數(shù)驅(qū)動的標(biāo)準(zhǔn)系統(tǒng)實用程序來定制或執(zhí)行拆分边翁。
合并:一種程序,它從多個輸入文件中讀取記錄硕盹,并生成一個輸出文件符匾,其中包含來自輸??入文件的組合數(shù)據(jù)〈窭可以通過參數(shù)驅(qū)動的標(biāo)準(zhǔn)系統(tǒng)實用程序來定制或執(zhí)行合并啊胶。
批量應(yīng)用程序還可以按其輸入源進(jìn)行分類:
數(shù)據(jù)庫驅(qū)動的應(yīng)用程序由從數(shù)據(jù)庫檢索的行或值驅(qū)動。
文件驅(qū)動的應(yīng)用程序由從文件中檢索的記錄或值驅(qū)動垛贤。
消息驅(qū)動的應(yīng)用程序由從消息隊列中檢索的消息驅(qū)動创淡。
任何批處理系統(tǒng)的基礎(chǔ)都是處理策略。影響策略選擇的因素包括:估計的批處理系統(tǒng)容量南吮,與在線系統(tǒng)或其他批處理系統(tǒng)的并發(fā)性琳彩,可用的批處理窗口。(請注意部凑,隨著越來越多的企業(yè)希望全天候運行通今,明確的批處理窗口正在消失)秦踪。
批處理的典型處理選項是(按實現(xiàn)復(fù)雜度的遞增順序):
在離線模式下批處理窗口期間的正常處理。
并發(fā)批處理或在線處理。
并行處理許多不同的批處理運行或作業(yè)床未。
分區(qū)(同時處理同一作業(yè)的許多實例)误甚。
上述選項的組合清钥。
商業(yè)調(diào)度程序可以支持部分或全部這些選項。
以下部分更詳細(xì)地討論了這些處理選項驹止。重要的是要注意,根據(jù)經(jīng)驗观蜗,批處理采用的提交和鎖定策略取決于所執(zhí)行的處理類型臊恋,并且在線鎖定策略也應(yīng)使用相同的原則。因此墓捻,在設(shè)計整體架構(gòu)時抖仅,批處理架構(gòu)不能簡單地成為事后的想法。
鎖定策略可以是僅使用普通數(shù)據(jù)庫鎖或在體系結(jié)構(gòu)中實現(xiàn)其他自定義鎖定服務(wù)砖第。鎖定服務(wù)將跟蹤數(shù)據(jù)庫鎖定(例如撤卢,通過將必要信息存儲在專用db表中)并對請求db操作的應(yīng)用程序提供或拒絕權(quán)限。此架構(gòu)還可以實現(xiàn)重試邏輯梧兼,以避免在發(fā)生鎖定情況時中止批處理作業(yè)放吩。
1.批處理窗口中的正常處理對于在單獨的批處理窗口中運行的簡單批處理進(jìn)程,其中在線用戶或其他批處理過程不需要更新的數(shù)據(jù)羽杰,并發(fā)性不是問題渡紫,可以在批次運行結(jié)束。
在大多數(shù)情況下忽洛,更強(qiáng)大的方法更合適。請記住环肘,批量系統(tǒng)隨著時間的推移有增長的趨勢欲虚,無論是復(fù)雜性還是處理的數(shù)據(jù)量。如果沒有鎖定策略并且系統(tǒng)仍然依賴于單個提交點悔雹,則修改批處理程序可能會很痛苦复哆。因此,即使使用最簡單的批處理系統(tǒng)腌零,也需要考慮重啟恢復(fù)選項的提交邏輯以及本節(jié)后面描述的更復(fù)雜情況的信息梯找。
2.并發(fā)批處理或在線處理批處理應(yīng)用程序處理可由在線用戶同時更新的數(shù)據(jù)不應(yīng)鎖定在線用戶可能需要的任何數(shù)據(jù)(數(shù)據(jù)庫或文件中)幾秒鐘。此外益涧,應(yīng)在每次交易結(jié)束時將更新提交到數(shù)據(jù)庫锈锤。這最小化了其他進(jìn)程不可用的數(shù)據(jù)部分以及數(shù)據(jù)不可用的時間。
最小化物理鎖定的另一個選項是使用樂觀鎖定模式或悲觀鎖定模式實現(xiàn)邏輯行級鎖定闲询。
樂觀鎖定假設(shè)記錄爭用的可能性很小久免。它通常意味著在批處理和聯(lián)機(jī)處理同時使用的每個數(shù)據(jù)庫表中插入時間戳列。當(dāng)應(yīng)用程序提取行進(jìn)行處理時扭弧,它還會獲取時間戳阎姥。當(dāng)應(yīng)用程序嘗試更新已處理的行時,更新將使用WHERE子句中的原始時間戳鸽捻。如果時間戳匹配呼巴,則更新數(shù)據(jù)和時間戳泽腮。如果時間戳不匹配,則表示另一個應(yīng)用程序在獲取和更新嘗試之間更新了同一行衣赶。因此诊赊,無法執(zhí)行更新。
悲觀鎖定是任何鎖定策略屑埋,假設(shè)存在記錄爭用的高可能性豪筝,因此需要在檢索時獲得物理或邏輯鎖定。一種悲觀邏輯鎖定使用數(shù)據(jù)庫表中的專用鎖定列摘能。當(dāng)應(yīng)用程序檢索要更新的行時续崖,它會在鎖定列中設(shè)置一個標(biāo)志。使用該標(biāo)志后团搞,嘗試檢索同一行的其他應(yīng)用程序在邏輯上會失敗严望。當(dāng)設(shè)置標(biāo)志的應(yīng)用程序更新該行時,它還會清除該標(biāo)志逻恐,從而使該行能夠被其他應(yīng)用程序檢索像吻。請注意,必須在初始提取和標(biāo)志設(shè)置之間保持?jǐn)?shù)據(jù)的完整性复隆,例如使用數(shù)據(jù)庫鎖(例如SELECT FOR UPDATE)拨匆。另請注意,此方法的缺點與物理鎖定相同挽拂,除了管理構(gòu)建超時機(jī)制更容易惭每,如果用戶在鎖定記錄時進(jìn)入午餐,則會釋放鎖定亏栈。
這些模式不一定適合批處理台腥,但它們可能用于并發(fā)批處理和聯(lián)機(jī)處理(例如在數(shù)據(jù)庫不支持行級鎖定的情況下)。作為一般規(guī)則绒北,樂觀鎖定更適合在線應(yīng)用程序黎侈,而悲觀鎖定更適合批處理應(yīng)用程序。每當(dāng)使用邏輯鎖定時闷游,必須對訪問受邏輯鎖保護(hù)的數(shù)據(jù)實體的所有應(yīng)用程序使用相同的方案峻汉。
請注意,這兩種解決方案僅解決鎖定單個記錄的問題脐往。通常俱济,我們可能需要鎖定邏輯上相關(guān)的記錄組。使用物理鎖钙勃,您必須非常小心地管理這些蛛碌,以避免潛在的死鎖。對于邏輯鎖辖源,通常最好構(gòu)建一個邏輯鎖管理器蔚携,該管理器了解您要保護(hù)的邏輯記錄組希太,并確保鎖是連貫的和非死鎖的。此邏輯鎖管理器通常使用自己的表進(jìn)行鎖管理酝蜒,爭用報告誊辉,超時機(jī)制和其他問題。
3.并行處理并行處理允許多個批處理運行或作業(yè)并行運行亡脑,以最大限度地減少總批處理時間堕澄。只要作業(yè)不共享相同的文件,db-tables或索引空間霉咨,這就不是問題蛙紫。如果他們這樣做,則應(yīng)使用分區(qū)數(shù)據(jù)實現(xiàn)此服務(wù)途戒。另一種選擇是通過使用控制表來構(gòu)建用于維護(hù)相互依賴性的體系結(jié)構(gòu)模塊坑傅。控制表應(yīng)包含每個共享資源的行以及它是否正由應(yīng)用程序使用喷斋。然后唁毒,批處理體系結(jié)構(gòu)或并行作業(yè)中的應(yīng)用程序?qū)脑摫碇袡z索信息,以確定它是否可以訪問它所需的資源星爪。
如果數(shù)據(jù)訪問不是問題浆西,則可以通過使用額外的線程并行處理來實現(xiàn)并行處理。在大型機(jī)環(huán)境中顽腾,傳統(tǒng)上使用并行作業(yè)類近零,以確保所有進(jìn)程有足夠的CPU時間。無論如何崔泵,該解決方案必須足夠強(qiáng)大秒赤,以確保所有正在運行的進(jìn)程的時間片猪瞬。
并行處理中的其他關(guān)鍵問題包括負(fù)載平衡和一般系統(tǒng)資源(如文件憎瘸,數(shù)據(jù)庫緩沖池等)的可用性。另請注意陈瘦,控制表本身很容易成為關(guān)鍵資源幌甘。
4.分區(qū)使用分區(qū)允許多個版本的大批量應(yīng)用程序同時運行。這樣做的目的是減少處理長批處理作業(yè)所需的時間痊项」纾可以成功分區(qū)的進(jìn)程是可以拆分輸入文件和/或?qū)χ鲾?shù)據(jù)庫表進(jìn)行分區(qū)以允許應(yīng)用程序針對不同數(shù)據(jù)集運行的進(jìn)程。
此外鞍泉,必須將分區(qū)的進(jìn)程設(shè)計為僅處理其分配的數(shù)據(jù)集皱埠。分區(qū)架構(gòu)必須與數(shù)據(jù)庫設(shè)計和數(shù)據(jù)庫分區(qū)策略緊密相關(guān)。請注意咖驮,數(shù)據(jù)庫分區(qū)并不一定意味著數(shù)據(jù)庫的物理分區(qū)边器,盡管在大多數(shù)情況下這是可取的训枢。下圖說明了分區(qū)方法:
該體系結(jié)構(gòu)應(yīng)足夠靈活,以允許動態(tài)配置分區(qū)數(shù)忘巧。應(yīng)考慮自動和用戶控制的配置恒界。自動配置可以基于諸如輸入文件大小和輸入記錄的數(shù)量之類的參數(shù)。
4.1分區(qū)方法選擇分區(qū)方法必須根據(jù)具體情況進(jìn)行砚嘴。以下列表描述了一些可能的分區(qū)方法:
1.記錄集的固定和均勻分解
這涉及將輸入記錄集分成偶數(shù)個部分(例如十酣,10,其中每個部分恰好是整個記錄集的十分之一)际长。然后耸采,每個部分由批/提取應(yīng)用程序的一個實例處理。
為了使用這種方法也颤,需要預(yù)處理來分割記錄集洋幻。此拆分的結(jié)果將是下限和上限放置編號,可用作批處理/提取應(yīng)用程序的輸入翅娶,以便將其處理限制為僅其部分文留。
預(yù)處理可能是一個很大的開銷,因為它必須計算和確定記錄集的每個部分的邊界竭沫。
2.按鍵列分解
這涉及拆分由鍵列設(shè)置的輸入記錄燥翅,并將每個鍵的數(shù)據(jù)分配給批處理實例。為了實現(xiàn)這一點蜕提,列值可以是:
通過分區(qū)表分配給批處理實例森书。
通過值的一部分(例如0000-0999,1000-1999等)分配給批處理實例。
在選項1下谎势,添加新值意味著手動重新配置批處理/提取以確保將新值添加到特定實例凛膏。
在選項2下,這可確保通過批處理作業(yè)的實例覆蓋所有值脏榆。但是猖毫,一個實例處理的值的數(shù)量取決于列值的分布(0000-0999范圍內(nèi)可能有大量位置,1000-1999范圍內(nèi)可能很少)须喂。在此選項下吁断,數(shù)據(jù)范圍應(yīng)設(shè)計為考慮分區(qū)。
在這兩個選項下坞生,無法實現(xiàn)記錄到批處理實例的最佳均勻分布仔役。沒有使用批處理實例數(shù)的動態(tài)配置。
3.按意見分解
這種方法基本上是由關(guān)鍵列分解是己,但在數(shù)據(jù)庫級別上又兵。它涉及將記錄集分解為視圖。批處理應(yīng)用程序的每個實例在處理過程中都使用這些視圖卒废。分解是通過對數(shù)據(jù)進(jìn)行分組來完成的沛厨。
使用此選項乘盼,必須將批處理應(yīng)用程序的每個實例配置為命中特定視圖(而不是主表)。此外俄烁,通過添加新數(shù)據(jù)值绸栅,必須將這組新數(shù)據(jù)包含在視圖中。沒有動態(tài)配置功能页屠,因為實例數(shù)量的更改會導(dǎo)致視圖發(fā)生更改粹胯。
4.增加處理指標(biāo)
這涉及向輸入表添加新列,該列充當(dāng)指示符辰企。作為預(yù)處理步驟风纠,所有指標(biāo)都標(biāo)記為未處理。在批處理應(yīng)用程序的記錄提取階段牢贸,讀取記錄的條件是該記錄被標(biāo)記為未處理竹观,并且一旦讀取它們(帶鎖定),它們就被標(biāo)記為正在處理中潜索。完成該記錄后臭增,指標(biāo)將更新為完成或錯誤。批處理應(yīng)用程序的許多實例可以在沒有更改的情況下啟動竹习,因為附加列確保僅處理一次記錄誊抛。在“完成時,指標(biāo)被標(biāo)記為完成”的順序中的一兩句話整陌。)
使用此選項拗窃,表上的I / O會動態(tài)增加。在更新批處理應(yīng)用程序的情況下泌辫,這種影響會減少随夸,因為無論如何都必須進(jìn)行寫入。
5.將表提取到平面文件
這涉及將表提取到文件中震放。然后宾毒,可以將此文件拆分為多個段,并將其用作批處理實例的輸入澜搅。
使用此選項伍俘,將表提取到文件中并將其拆分的額外開銷可能會抵消多分區(qū)的影響邪锌∶闾桑可以通過更改文件拆分腳本來實現(xiàn)動態(tài)配置。
6.使用哈希柱
此方案涉及向用于檢索驅(qū)動程序記錄的數(shù)據(jù)庫表添加哈希列(鍵/索引)觅丰。此哈希列具有一個指示器饵溅,用于確定批處理應(yīng)用程序的哪個實例處理此特定行。例如妇萄,如果要啟動三個批處理實例蜕企,則指示符“A”標(biāo)記要由實例1處理的行咬荷,“B”的指示符標(biāo)記要由實例2處理的行,以及指示符“C” '標(biāo)記了實例3處理的行轻掩。
然后幸乒,用于檢索記錄的過程將有一個附加WHERE子句來選擇由特定指示符標(biāo)記的所有行。此表中的插入將涉及添加標(biāo)記字段唇牧,該字段將默認(rèn)為其中一個實例(例如“A”)罕扎。
將使用簡單的批處理應(yīng)用程序來更新指示符,例如在不同實例之間重新分配負(fù)載丐重。當(dāng)添加了足夠多的新行時腔召,可以運行此批處理(除批處理窗口外的任何時間)以將新行重新分發(fā)到其他實例。
批處理應(yīng)用程序的其他實例僅需要運行前面段落中所述的批處理應(yīng)用程序扮惦,以重新分配指示符以使用新的實例數(shù)臀蛛。
4.2數(shù)據(jù)庫和應(yīng)用程序設(shè)計原則
支持使用鍵列方法針對分區(qū)數(shù)據(jù)庫表運行的多分區(qū)應(yīng)用程序的體系結(jié)構(gòu)應(yīng)包括用于存儲分區(qū)參數(shù)的中央分區(qū)存儲庫。這提供了靈活性并確保了可維護(hù)性崖蜜。存儲庫通常由單個表組成浊仆,稱為分區(qū)表。
存儲在分區(qū)表中的信息是靜態(tài)的豫领,通常應(yīng)由DBA維護(hù)氧卧。該表應(yīng)包含多行分區(qū)應(yīng)用程序的每個分區(qū)的一行信息。該表應(yīng)包含程序ID代碼氏堤,分區(qū)號(分區(qū)的邏輯ID)沙绝,此分區(qū)的db鍵列的低值以及此分區(qū)的db鍵列的高值。
在程序啟動時鼠锈,id應(yīng)該從體系結(jié)構(gòu)(特別是從Control Processing Tasklet)將程序和分區(qū)號傳遞給應(yīng)用程序闪檬。如果使用鍵列方法,則使用這些變量來讀取分區(qū)表购笆,以確定應(yīng)用程序要處理的數(shù)據(jù)范圍粗悯。此外,在整個處理過程中必須使用分區(qū)號:
添加到輸出文件/數(shù)據(jù)庫更新同欠,以使合并過程正常工作样傍。
向批處理日志報告正常處理,并向架構(gòu)錯誤處理程序報告任何錯誤铺遂。
4.3盡量減少死鎖
當(dāng)應(yīng)用程序并行運行或分區(qū)時衫哥,可能會發(fā)生數(shù)據(jù)庫資源爭用和死鎖。作為數(shù)據(jù)庫設(shè)計的一部分襟锐,數(shù)據(jù)庫設(shè)計團(tuán)隊盡可能地消除潛在的爭用情況至關(guān)重要撤逢。
此外,開發(fā)人員必須確保數(shù)據(jù)庫索引表的設(shè)計時考慮到死鎖和性能。
管理或體系結(jié)構(gòu)表中經(jīng)常出現(xiàn)死鎖或熱點蚊荣,例如日志表初狰,控制表和鎖定表。還應(yīng)考慮到這些問題的影響互例。實際壓力測試對于識別架構(gòu)中可能存在的瓶頸至關(guān)重要奢入。
為了最大限度地減少沖突對數(shù)據(jù)的影響,架構(gòu)應(yīng)在附加到數(shù)據(jù)庫或遇到死鎖時提供等待和重試間隔等服務(wù)媳叨。這意味著內(nèi)置機(jī)制對某些數(shù)據(jù)庫返回代碼作出反應(yīng)俊马,而不是發(fā)出立即錯誤,等待預(yù)定的時間并重試數(shù)據(jù)庫操作肩杈。
4.4參數(shù)傳遞和驗證
分區(qū)架構(gòu)應(yīng)該對應(yīng)用程序開發(fā)人員相對透明柴我。該體系結(jié)構(gòu)應(yīng)執(zhí)行與以分區(qū)模式運行應(yīng)用程序相關(guān)的所有任務(wù),包括:
在應(yīng)用程序啟動之前檢索分區(qū)參數(shù)扩然。
在應(yīng)用程序啟動之前驗證分區(qū)參數(shù)艘儒。
在啟動時將參數(shù)傳遞給應(yīng)用程序。
驗證應(yīng)包括檢查以確保:
該應(yīng)用程序有足夠的分區(qū)來覆蓋整個數(shù)據(jù)范圍夫偶。
分區(qū)之間沒有間隙界睁。
如果數(shù)據(jù)庫已分區(qū),則可能需要進(jìn)行一些額外的驗證兵拢,以確保單個分區(qū)不跨越數(shù)據(jù)庫分區(qū)翻斟。
此外,該體系結(jié)構(gòu)應(yīng)考慮分區(qū)的合并说铃。關(guān)鍵問題包括:
在進(jìn)入下一個工作步驟之前访惜,是否必須完成所有分區(qū)?
如果其中一個分區(qū)中止會發(fā)生什么腻扇?