為了幫助設(shè)計(jì)和實(shí)現(xiàn)批量處理系統(tǒng),基本的批量應(yīng)用是通過(guò)塊和模式來(lái)構(gòu)建的,同時(shí)也應(yīng)該能夠?yàn)槌绦蜷_(kāi)發(fā)人員和設(shè)計(jì)人員提供結(jié)構(gòu)的樣例和基礎(chǔ)的批量處理程序。
當(dāng)你開(kāi)始設(shè)計(jì)一個(gè)批量作業(yè)任務(wù)的時(shí)候,商業(yè)邏輯應(yīng)該被拆分一系列的步驟,而這些步驟又是可以通過(guò)下面的標(biāo)準(zhǔn)構(gòu)件塊來(lái)實(shí)現(xiàn)的:
轉(zhuǎn)換應(yīng)用程序(Conversion Applications):針對(duì)每一個(gè)從外部系統(tǒng)導(dǎo)出或者提供的各種類型的文件,我們都需要?jiǎng)?chuàng)建一個(gè)轉(zhuǎn)換應(yīng)用程序來(lái)講這些類型的文件和數(shù)據(jù)轉(zhuǎn)換為處理所需要的標(biāo)準(zhǔn)格式。這個(gè)類型的批量應(yīng)用程序可以是正規(guī)轉(zhuǎn)換工具模塊中的一部分,也可以是整個(gè)的轉(zhuǎn)換工具模塊(請(qǐng)查看:基本的批量服務(wù)(Basic Batch Services))。
校驗(yàn)應(yīng)用程序(Validation Applications):校驗(yàn)應(yīng)用程序能夠保證所有的輸入和輸出記錄都是正確和一致的。校驗(yàn)通常是基于頭和尾進(jìn)行校驗(yàn)的,校驗(yàn)碼和校驗(yàn)算法通常是針對(duì)記錄的交叉驗(yàn)證。
提取應(yīng)用(Extract Applications):這個(gè)應(yīng)用程序通常被用來(lái)從數(shù)據(jù)庫(kù)或者文本文件中讀取一系列的記錄,并對(duì)記錄的選擇通常是基于預(yù)先確定的規(guī)則,然后將這些記錄輸出到輸出文件中。
提取/更新應(yīng)用(Extract/Update Applications):這個(gè)應(yīng)用程序通常被用來(lái)從數(shù)據(jù)庫(kù)或者文本文件中讀取記錄,并將每一條讀取的輸入記錄更新到數(shù)據(jù)庫(kù)或者輸出數(shù)據(jù)庫(kù)中。
處理和更新應(yīng)用(Processing and Updating Applications):這種程序?qū)奶崛』蝌?yàn)證程序 傳過(guò)來(lái)的輸入事務(wù)記錄進(jìn)行處理。這處理通常包括有讀取數(shù)據(jù)庫(kù)并且獲得需要處理的數(shù)據(jù),為輸出處理更新數(shù)據(jù)庫(kù)或創(chuàng)建記錄。
輸出和格式化應(yīng)用(Output/Format Applications):一個(gè)應(yīng)用通過(guò)讀取一個(gè)輸入文件,對(duì)輸入文件的結(jié)構(gòu)重新格式化為需要的標(biāo)準(zhǔn)格式,然后創(chuàng)建一個(gè)打印的輸出文件,或?qū)?shù)據(jù)傳輸?shù)狡渌某绦蚧蛘呦到y(tǒng)中。
更多的,一個(gè)基本的應(yīng)用外殼應(yīng)該也能夠被針對(duì)商業(yè)邏輯來(lái)提供,這個(gè)外殼通常不能通過(guò)上面介紹的這些標(biāo)準(zhǔn)模塊來(lái)完成。
另外的一個(gè)主要的構(gòu)建塊,每一個(gè)引用通常可以使用下面的一個(gè)或者多個(gè)標(biāo)準(zhǔn)工具步驟,例如:
分類(Sort)- 一個(gè)程序可以讀取輸入文件后生成一個(gè)輸出文件,在這個(gè)輸出文件中可以對(duì)記錄進(jìn)行重新排序,重新排序的是根據(jù)給定記錄的關(guān)鍵字段進(jìn)行重新排序的。分類通常使用標(biāo)準(zhǔn)的系統(tǒng)工具來(lái)執(zhí)行。
拆分(Split)- 一個(gè)程序可以讀取輸入文件后,根據(jù)需要的字段值,將輸入的文件拆分為多個(gè)文件進(jìn)行輸出。拆分通常使用標(biāo)準(zhǔn)的系統(tǒng)工具來(lái)執(zhí)行。
合并(Merge)- 一個(gè)程序可以讀取多個(gè)輸入文件,然后將多個(gè)輸入文件進(jìn)行合并處理后生成為一個(gè)單一的輸出文件。合并可以自定義或者由參數(shù)驅(qū)動(dòng)的(parameter-driven)系統(tǒng)實(shí)用程序來(lái)執(zhí)行.
批量處理應(yīng)用程序可以通過(guò)下面的輸入數(shù)據(jù)類型來(lái)進(jìn)行分類:
數(shù)據(jù)庫(kù)驅(qū)動(dòng)應(yīng)用程序(Database-driven applications)可以通過(guò)從數(shù)據(jù)庫(kù)中獲得的行或值來(lái)進(jìn)行驅(qū)動(dòng)。
文件驅(qū)動(dòng)應(yīng)用程序(File-driven applications)?可以通過(guò)從文件中獲得的數(shù)據(jù)來(lái)進(jìn)行驅(qū)動(dòng)。
消息驅(qū)動(dòng)應(yīng)用程序(Message-driven applications)?可以通過(guò)從消息隊(duì)列中獲得的數(shù)據(jù)來(lái)進(jìn)行驅(qū)動(dòng)。
所有批量處理系統(tǒng)的處理基礎(chǔ)都是策略(strategy)。對(duì)處理策略進(jìn)行選擇產(chǎn)生影響的因素包括有:預(yù)估批量處理需要處理的數(shù)據(jù)量,在線并發(fā)量,和另外一個(gè)批量處理系統(tǒng)的在線并發(fā)量,可用的批量處理時(shí)間窗口(很多企業(yè)都希望系統(tǒng)是能夠不間斷運(yùn)行的,基本上來(lái)說(shuō)批量處理可能沒(méi)有處理時(shí)間窗口)。
針對(duì)批量處理的標(biāo)準(zhǔn)處理選項(xiàng)包括有:
在一個(gè)批處理窗口中執(zhí)行常規(guī)離線批處理
并發(fā)批量 / 在線處理
并發(fā)處理很多不同的批量處理或者有很多批量作業(yè)在同一時(shí)間運(yùn)行
分區(qū)(Partitioning),就是在同一時(shí)間有很多示例在運(yùn)行相同的批量作業(yè)
混合上面的一些需求
上面列表中的順序代表了批處理實(shí)現(xiàn)復(fù)雜性的排序,在同一個(gè)批處理窗口的處理最簡(jiǎn)單,而分區(qū)實(shí)現(xiàn)最復(fù)雜。
上面的一些選項(xiàng)或者所有選項(xiàng)能夠被商業(yè)的任務(wù)調(diào)度所支持。
在下面的部分,我們將會(huì)針對(duì)上面的處理選項(xiàng)來(lái)對(duì)細(xì)節(jié)進(jìn)行更多的說(shuō)明。需要特別注意的是,批量處理程序使用提交和鎖定策略將會(huì)根據(jù)批量處理的不同而有所不同。作為最佳實(shí)踐,在線鎖策略應(yīng)該使用相同的原則。因此,在設(shè)計(jì)批處理整體架構(gòu)時(shí)不能簡(jiǎn)單地拍腦袋決定,需要進(jìn)行詳細(xì)的分析和論證。
鎖定策略可以僅僅使用常見(jiàn)的數(shù)據(jù)庫(kù)鎖或者你也可以在系統(tǒng)架構(gòu)中使用其他的自定義鎖定服務(wù)。這個(gè)鎖服務(wù)將會(huì)跟蹤數(shù)據(jù)庫(kù)的鎖(例如在一個(gè)專用的數(shù)據(jù)庫(kù)表(db-table)中存儲(chǔ)必要的信息),然后在應(yīng)用程序請(qǐng)求數(shù)據(jù)庫(kù)操作時(shí)授予權(quán)限或拒絕。重試邏輯應(yīng)該也需要在系統(tǒng)架構(gòu)中實(shí)現(xiàn),以避免批量作業(yè)中的因資源鎖定而導(dǎo)致批量任務(wù)被終止。
批量處理作業(yè)窗口中的常規(guī)處理
針對(duì)運(yùn)行在一個(gè)單獨(dú)批處理窗口中的簡(jiǎn)單批量處理,更新的數(shù)據(jù)對(duì)在線用戶或其他批處理來(lái)說(shuō)并沒(méi)有實(shí)時(shí)性要求,也沒(méi)有并發(fā)問(wèn)題,在批處理運(yùn)行完成后執(zhí)行單次提交即可。
大多數(shù)情況下,一種更健壯的方法會(huì)更合適.要記住的是,批處理系統(tǒng)會(huì)隨著時(shí)間的流逝而增長(zhǎng),包括復(fù)雜度和需要處理的數(shù)據(jù)量。如果沒(méi)有合適的鎖定策略,系統(tǒng)仍然依賴于一個(gè)單一的提交點(diǎn),則修改批處理程序會(huì)是一件痛苦的事情。?因此,即使是最簡(jiǎn)單的批處理系統(tǒng),也應(yīng)該為重啟-恢復(fù)(restart-recovery)選項(xiàng)考慮提交邏輯。針對(duì)下面的情況,批量處理就更加復(fù)雜了。
并發(fā)批量 / 在線處理
批處理程序處理的數(shù)據(jù)如果會(huì)同時(shí)被在線用戶實(shí)時(shí)更新,就不應(yīng)該鎖定在線用戶需要的所有任何數(shù)據(jù)(不管是數(shù)據(jù)庫(kù)還是文件),即使只需要鎖定幾秒鐘的時(shí)間。
還應(yīng)該每處理一批事務(wù)就提交一次數(shù)據(jù)庫(kù)。這減少了其他程序不可用的數(shù)據(jù)數(shù)據(jù)量,也壓縮了數(shù)據(jù)不可用的時(shí)間。
另一個(gè)可以使用的方案就是使用邏輯行基本的鎖定實(shí)現(xiàn)來(lái)替代物理鎖定。通過(guò)使用樂(lè)觀鎖(Optimistic Locking?)或悲觀鎖(Pessimistic Locking)模式。
樂(lè)觀鎖假設(shè)記錄爭(zhēng)用的可能性很低。這通常意味著并發(fā)批處理和在線處理所使用的每個(gè)數(shù)據(jù)表中都有一個(gè)時(shí)間戳列。當(dāng)程序讀取一行進(jìn)行處理時(shí),同時(shí)也獲得對(duì)應(yīng)的時(shí)間戳。當(dāng)程序處理完該行以后嘗試更新時(shí),在 update 操作的 WHERE 子句中使用原來(lái)的時(shí)間戳作為條件.如果時(shí)間戳相匹配,則數(shù)據(jù)和時(shí)間戳都更新成功。如果時(shí)間戳不匹配,這表明在本程序上次獲取和此次更新這段時(shí)間內(nèi)已經(jīng)有另一個(gè)程序修改了同一條記錄,因此更新不會(huì)被執(zhí)行。
悲觀鎖定策略假設(shè)記錄爭(zhēng)用的可能性很高,因此在檢索時(shí)需要獲得一個(gè)物理鎖或邏輯鎖。有一種悲觀邏輯鎖在數(shù)據(jù)表中使用一個(gè)專用的 lock-column 列。當(dāng)程序想要為更新目的而獲取一行時(shí),它在 lock column 上設(shè)置一個(gè)標(biāo)志。如果為某一行設(shè)置了標(biāo)志位,其他程序在試圖獲取同一行時(shí)將會(huì)邏輯上獲取失敗。當(dāng)設(shè)置標(biāo)志的程序更新該行時(shí),它也同時(shí)清除標(biāo)志位,允許其他程序獲取該行。請(qǐng)注意,在初步獲取和初次設(shè)置標(biāo)志位這段時(shí)間內(nèi)必須維護(hù)數(shù)據(jù)的完整性,比如使用數(shù)據(jù)庫(kù)鎖(例如,SELECT FOR UPDATE)。還請(qǐng)注意,這種方法和物理鎖都有相同的缺點(diǎn),除了它在構(gòu)建一個(gè)超時(shí)機(jī)制時(shí)比較容易管理。比如記錄而用戶去吃午餐了,則超時(shí)時(shí)間到了以后鎖會(huì)被自動(dòng)釋放。
這些模式并不一定適用于批處理,但他們可以被用在并發(fā)批處理和在線處理的情況下(例如,數(shù)據(jù)庫(kù)不支持行級(jí)鎖)。作為一般規(guī)則,樂(lè)觀鎖更適合于在線應(yīng)用,而悲觀鎖更適合于批處理應(yīng)用。只要使用了邏輯鎖,那么所有訪問(wèn)邏輯鎖保護(hù)的數(shù)據(jù)的程序都必須采用同樣的方案。
請(qǐng)注意:這兩種解決方案都只鎖定(address locking)單條記錄。但很多情況下我們需要鎖定一組相關(guān)的記錄。如果使用物理鎖,你必須非常小心地管理這些以避免潛在的死鎖。如果使用邏輯鎖,通常最好的解決辦法是創(chuàng)建一個(gè)邏輯鎖管理器,使管理器能理解你想要保護(hù)的邏輯記錄分組(groups),并確保連貫和沒(méi)有死鎖(non-deadlocking)。這種邏輯鎖管理器通常使用其私有的表來(lái)進(jìn)行鎖管理、爭(zhēng)用報(bào)告、超時(shí)機(jī)制 等等。
并行處理
并行處理允許多個(gè)批量處理運(yùn)行(run)/任務(wù)(job)同時(shí)并行地運(yùn)行。以使批量處理總運(yùn)行時(shí)間降到最低。如果多個(gè)任務(wù)不使用相同的文件、數(shù)據(jù)表、索引空間時(shí),批量處理這些不算什么問(wèn)題。如果確實(shí)存在共享和競(jìng)爭(zhēng),那么這個(gè)服務(wù)就應(yīng)該使用分區(qū)數(shù)據(jù)來(lái)實(shí)現(xiàn)。另一種選擇是使用控制表來(lái)構(gòu)建一個(gè)架構(gòu)模塊以維護(hù)他們之間的相互依賴關(guān)系。控制表應(yīng)該為每個(gè)共享資源分配一行記錄,不管這些資源是否被某個(gè)程序所使用。執(zhí)行并行作業(yè)的批處理架構(gòu)或程序隨后將查詢這個(gè)控制表,以確定是否可以訪問(wèn)所需的資源。
如果解決了數(shù)據(jù)訪問(wèn)的問(wèn)題,并行處理就可以通過(guò)使用額外的線程來(lái)并行實(shí)現(xiàn)。在傳統(tǒng)的大型主機(jī)環(huán)境中,并行作業(yè)類上通常被用來(lái)確保所有進(jìn)程都有充足的 CPU 時(shí)間。無(wú)論如何,解決方案必須足夠強(qiáng)勁,以確保所有正在運(yùn)行的進(jìn)程都有足夠的運(yùn)行處理時(shí)間。
并行處理的其他關(guān)鍵問(wèn)題還包括負(fù)載平衡以及一般系統(tǒng)資源的可用性(如文件、數(shù)據(jù)庫(kù)緩沖池等)。請(qǐng)注意,控制表本身也可能很容易變成一個(gè)至關(guān)重要的資源(有可能發(fā)生嚴(yán)重競(jìng)爭(zhēng))。
分區(qū)
分區(qū)技術(shù)允許多版本的大型批處理程序并發(fā)地(concurrently)運(yùn)行。這樣做的目的是減少超長(zhǎng)批處理作業(yè)過(guò)程所需的時(shí)間。
可以成功分區(qū)的過(guò)程主要是那些可以拆分的輸入文件 和/或 主要的數(shù)據(jù)庫(kù)表被分區(qū)以允許程序使用不同的數(shù)據(jù)來(lái)運(yùn)行。
此外,被分區(qū)的過(guò)程必須設(shè)計(jì)為只處理分配給他的數(shù)據(jù)集。分區(qū)架構(gòu)與數(shù)據(jù)庫(kù)設(shè)計(jì)和數(shù)據(jù)庫(kù)分區(qū)策略是密切相關(guān)的。請(qǐng)注意,數(shù)據(jù)庫(kù)分區(qū)并不一定指數(shù)據(jù)庫(kù)需要在物理上實(shí)現(xiàn)分區(qū),盡管在大多數(shù)情況下這是明智的。
下面的圖片展示了分區(qū)的方法:
上圖: 分區(qū)處理
系統(tǒng)架構(gòu)應(yīng)該足夠靈活,以允許動(dòng)態(tài)配置分區(qū)的數(shù)量。自動(dòng)控制和用戶配置都應(yīng)該納入考慮范圍。自動(dòng)配置可以根據(jù)參數(shù)來(lái)決定,例如輸入文件大小 和/或 輸入記錄的數(shù)量。
分區(qū)方案
面列出了一些可能的分區(qū)方案,至于具體選擇哪種分區(qū)方案,要根據(jù)具體情況來(lái)確定:
固定和均衡拆分記錄集
這涉及到將輸入的記錄集合分解成均衡的部分(例如,拆分為 10 份,這樣每部分是整個(gè)數(shù)據(jù)集的十分之一)。每個(gè)拆分的部分稍后由一個(gè)批處理/提取程序?qū)嵗齺?lái)處理。
為了使用這種方案,需要在預(yù)處理時(shí)候就將記錄集進(jìn)行拆分。拆分的結(jié)果有一個(gè)最大值和最小值的位置,這兩個(gè)值可以用作限制每個(gè) 批處理/提取程序處理部分的輸入。
預(yù)處理可能有一個(gè)很大的開(kāi)銷,因?yàn)樗仨氂?jì)算并確定的每部分?jǐn)?shù)據(jù)集的邊界。
通過(guò)關(guān)鍵字段(Key Column)拆分
這涉及到將輸入記錄按照某個(gè)關(guān)鍵字段來(lái)拆分,比如一個(gè)地區(qū)代碼(location code),并將每個(gè)鍵分配給一個(gè)批處理實(shí)例。為了達(dá)到這個(gè)目標(biāo),也可以使用列值。
通過(guò)分區(qū)表來(lái)指派給一個(gè)批量處理實(shí)例
請(qǐng)查看下面的詳細(xì)說(shuō)明。
在使用這種方法時(shí), 新值的添加將意味著需要手動(dòng)重新配置批處理/提取程序,以確保新值被添加到某個(gè)特定的實(shí)例。
通過(guò)數(shù)據(jù)的部分值指派給一個(gè)批量處理實(shí)例
例如,值?0000-0999, 1000 - 1999, 等。
使用這種方法的時(shí)候,將確保所有的值都會(huì)被某個(gè)批處理作業(yè)實(shí)例處理到。然而,一個(gè)實(shí)例處理的值的數(shù)量依賴于列值的分布(即可能存在大量的值分布在0000-0999范圍內(nèi),而在1000-1999范圍內(nèi)的值卻很少)。如果使用這種方法,設(shè)計(jì)時(shí)應(yīng)該考慮到數(shù)據(jù)范圍的切分。
使用?通過(guò)分區(qū)表來(lái)指派 和通過(guò)數(shù)據(jù)的部分值,?在這兩種方法中,并不能將指定給批處理實(shí)例的記錄實(shí)現(xiàn)最佳均勻分布。批處理實(shí)例的數(shù)量并不能動(dòng)態(tài)配置。
通過(guò)視圖(Views)
這種方法基本上是根據(jù)鍵列來(lái)分解,但不同的是在數(shù)據(jù)庫(kù)級(jí)進(jìn)行分解。它涉及到將記錄集分解成視圖。這些視圖將被批處理程序的各個(gè)實(shí)例在處理時(shí)使用。分解將通過(guò)數(shù)據(jù)分組來(lái)完成。
使用這個(gè)方法時(shí),批處理的每個(gè)實(shí)例都必須為其配置一個(gè)特定的視圖(而非主表)。當(dāng)然,對(duì)于新添加的數(shù)據(jù),這個(gè)新的數(shù)據(jù)分組必須被包含在某個(gè)視圖中。也沒(méi)有自動(dòng)配置功能,實(shí)例數(shù)量的變化將導(dǎo)致視圖需要進(jìn)行相應(yīng)的改變。
附加的處理識(shí)別器
這涉及到輸入表一個(gè)附加的新列,它充當(dāng)一個(gè)指示器。在預(yù)處理階段,所有指示器都被標(biāo)志為未處理。在批處理程序獲取記錄階段,只會(huì)讀取被標(biāo)記為未處理的記錄,一旦他們被讀取(并加鎖),它們就被標(biāo)記為正在處理狀態(tài)。當(dāng)記錄處理完成,指示器將被更新為完成或錯(cuò)誤。批處理程序的多個(gè)實(shí)例不需要改變就可以開(kāi)始,因?yàn)楦郊恿写_保每條紀(jì)錄只被處理一次。
使用該選項(xiàng)時(shí),表上的I/O會(huì)動(dòng)態(tài)地增長(zhǎng)。在批量更新的程序中,這種影響被降低了,因?yàn)閷懖僮魇潜囟ㄒM(jìn)行的。
提取表到無(wú)格式文件
這包括將表中的數(shù)據(jù)提取到一個(gè)文件中。然后可以將這個(gè)文件拆分成多個(gè)部分,作為批處理實(shí)例的輸入。
使用這個(gè)選項(xiàng)時(shí),將數(shù)據(jù)提取到文件中,并將文件拆分的額外開(kāi)銷,有可能抵消多分區(qū)處理(multi-partitioning)的效果。可以通過(guò)改變文件分割腳本來(lái)實(shí)現(xiàn)動(dòng)態(tài)配置。
With this option, the additional overhead of extracting the table into a file, and splitting it, may cancel out the effect of multi-partitioning. Dynamic configuration can be achieved via changing the file splitting script.
使用哈希列(Hashing Column)
這個(gè)計(jì)劃需要在數(shù)據(jù)庫(kù)表中增加一個(gè)哈希列(key/index)來(lái)檢索驅(qū)動(dòng)(driver)記錄。這個(gè)哈希列將有一個(gè)指示器來(lái)確定將由批處理程序的哪個(gè)實(shí)例處理某個(gè)特定的行。例如,如果啟動(dòng)了三個(gè)批處理實(shí)例,那么 “A” 指示器將標(biāo)記某行由實(shí)例 1 來(lái)處理,“B”將標(biāo)記著將由實(shí)例 2 來(lái)處理,以此類推。
稍后用于檢索記錄的過(guò)程(procedure)程序,將有一個(gè)額外的 WHERE 子句來(lái)選擇以一個(gè)特定指標(biāo)標(biāo)記的所有行。這個(gè)表的插入(insert)需要附加的標(biāo)記字段,默認(rèn)值將是其中的某一個(gè)實(shí)例(例如“A”)。
一個(gè)簡(jiǎn)單的批處理程序?qū)⒈挥脕?lái)更新不同實(shí)例之間的重新分配負(fù)載的指標(biāo)。當(dāng)添加足夠多的新行時(shí),這個(gè)批處理會(huì)被運(yùn)行(在任何時(shí)間,除了在批處理窗口中)。
批處理應(yīng)用程序的其他實(shí)例只需要像上面這樣的批處理程序運(yùn)行著以重新分配指標(biāo),以決定新實(shí)例的數(shù)量。
數(shù)據(jù)庫(kù)和應(yīng)用設(shè)計(jì)原則
如果一個(gè)支持多分區(qū)(multi-partitioned)的應(yīng)用程序架構(gòu),基于數(shù)據(jù)庫(kù)采用關(guān)鍵列(key column)分區(qū)方法拆成的多個(gè)表,則應(yīng)該包含一個(gè)中心分區(qū)倉(cāng)庫(kù)來(lái)存儲(chǔ)分區(qū)參數(shù)。這種方式提供了靈活性,并保證了可維護(hù)性。這個(gè)中心倉(cāng)庫(kù)通常只由單個(gè)表組成,叫做分區(qū)表。
存儲(chǔ)在分區(qū)表中的信息應(yīng)該是是靜態(tài)的,并且只能由 DBA 維護(hù)。每個(gè)多分區(qū)程序?qū)?yīng)的單個(gè)分區(qū)有一行記錄,組成這個(gè)表。這個(gè)表應(yīng)該包含這些列:程序 ID 編號(hào),分區(qū)編號(hào)(分區(qū)的邏輯ID),一個(gè)分區(qū)對(duì)應(yīng)的關(guān)鍵列(key column)的最小值,分區(qū)對(duì)應(yīng)的關(guān)鍵列的最大值。
在程序啟動(dòng)時(shí),應(yīng)用程序架構(gòu)(Control Processing Tasklet, 控制處理微線程)應(yīng)該將程序 id 和分區(qū)號(hào)傳遞給該程序。這些變量被用于讀取分區(qū)表,來(lái)確定應(yīng)用程序應(yīng)該處理的數(shù)據(jù)范圍(如果使用關(guān)鍵列的話)。另外分區(qū)號(hào)必須在整個(gè)處理過(guò)程中用來(lái):
為了使合并程序正常工作,需要將分區(qū)號(hào)添加到輸出文件/數(shù)據(jù)庫(kù)更新
向框架的錯(cuò)誤處理程序報(bào)告正常處理批處理日志和執(zhí)行期間發(fā)生的所有錯(cuò)誤
死鎖最小化
當(dāng)程序并行或分區(qū)運(yùn)行時(shí),會(huì)導(dǎo)致數(shù)據(jù)庫(kù)資源的爭(zhēng)用,還可能會(huì)發(fā)生死鎖(Deadlocks)。其中的關(guān)鍵是數(shù)據(jù)庫(kù)設(shè)計(jì)團(tuán)隊(duì)在進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)必須考慮盡可能消除潛在的競(jìng)爭(zhēng)情況。
還要確保設(shè)計(jì)數(shù)據(jù)庫(kù)表的索引時(shí)考慮到性能以及死鎖預(yù)防。
死鎖或熱點(diǎn)往往發(fā)生在管理或架構(gòu)表上,如日志表、控制表、鎖表(lock tables)。這些影響也應(yīng)該納入考慮。為了確定架構(gòu)可能的瓶頸,一個(gè)真實(shí)的壓力測(cè)試是至關(guān)重要的。
要最小化數(shù)據(jù)沖突的影響,架構(gòu)應(yīng)該提供一些服務(wù),如附加到數(shù)據(jù)庫(kù)或遇到死鎖時(shí)的 等待-重試(wait-and-retry)間隔時(shí)間。這意味著要有一個(gè)內(nèi)置的機(jī)制來(lái)處理數(shù)據(jù)庫(kù)返回碼,而不是立即引發(fā)錯(cuò)誤處理,需要等待一個(gè)預(yù)定的時(shí)間并重試執(zhí)行數(shù)據(jù)庫(kù)操作。
參數(shù)處理和校驗(yàn)
對(duì)程序開(kāi)發(fā)人員來(lái)說(shuō),分區(qū)架構(gòu)應(yīng)該相對(duì)透明。框架以分區(qū)模式運(yùn)行時(shí)應(yīng)該執(zhí)行的相關(guān)任務(wù)包括:
在程序啟動(dòng)之前獲取分區(qū)參數(shù)
在程序啟動(dòng)之前驗(yàn)證分區(qū)參數(shù)
在啟動(dòng)時(shí)將參數(shù)傳遞給應(yīng)用程序
驗(yàn)證(validation)要包含必要的檢查,以確保:
應(yīng)用程序已經(jīng)足夠涵蓋整個(gè)數(shù)據(jù)的分區(qū)
在各個(gè)分區(qū)之間沒(méi)有遺漏斷代(gaps)
如果數(shù)據(jù)庫(kù)是分區(qū)的,可能需要一些額外的驗(yàn)證來(lái)保證單個(gè)分區(qū)不會(huì)跨越數(shù)據(jù)庫(kù)的片區(qū)。
體系架構(gòu)應(yīng)該考慮整合分區(qū)(partitions).包括以下關(guān)鍵問(wèn)題:
在進(jìn)入下一個(gè)任務(wù)步驟之前是否所有的分區(qū)都必須完成?
如果一個(gè)分區(qū) Job 中止了要怎么處理?
https://www.cwiki.us/display/SpringBatchZH/Batch+Processing+Strategies