2010-10-22 99 views
1

我正在尋找的想法對系統如何你的建築師,像這樣的批量處理數據的系統:架構設計與指標

記錄進來散裝(100,000個在同一時間)從各種來源但主要是一個平面文本文件。

需要將這些數據按原樣推入SQL Server數據庫表中。但是,需要計算各種指標。例如,一個字段是某個4位數的代碼。只有某些4位代碼是有效的,我們需要跟蹤有多少記錄到達4位數的錯誤代碼。還有其他領域需要「驗證」,而且領域列表可能在未來發生變化。

什麼是這樣一個系統的好設計?是否最好有事件BadFourDigitCodeEncountered和事件處理器OnBadFourDigitCodeEncountered或者是否有更簡潔的設計,容易維護?

(我不認爲它應該的問題,但我使用NHibernate作爲我的ORM,但也許這是很有必要知道,因爲NHibernate的具有不同點掛接到?)

我應該提到:使用C#。 NET 4.0。

由於提前, 阿倫

回答

2

對於大多數大容量文件到數據庫進程,我會建築師它作爲一個ETVL(提取 - 轉換 - 驗證負荷)的工作流程。

提取:打開文件,獲取數據行並將它們放入隊列中,由變換層處理。

變換:抓取原始記錄數據,將其分割成您關心的字段並使用字段數據創建新的域對象。然後這個對象進入隊列,由validate圖層處理。

驗證:通過一系列旨在確保記錄處於有效且一致的狀態的業務規則來運行您的域對象。有效的對象被標記爲這樣(通過將它們放置在「好」隊列中,或者將它們放在一個簡單的類中,在將它們放入隊列中之前將它們包含在一個簡單的類中)並放入加載器的最後一個隊列中。您可以在每個批次中計算您的指標,也可以通過將「失敗」記錄放入另一個表格中,實時獲取指標,並使用錯誤代碼描述錯誤,並查詢一個批次或多個批次的閒置數量和原因。

加載:將域對象保存到系統的數據庫中。

這些階段中的每一個都應該是單獨的方法,甚至是由「主管」進程管理的類。這種設計的美妙之處在於其可擴展性。如果最終得到大量驗證或轉換邏輯,從而減慢進程速度,可以非常輕鬆地修改主管以對這些階段進行多線程處理,從而在需要的地方添加額外的處理器功能。它也是模塊化的;如果文件格式發生變化,則只需更改過程的變換階段(如果變化足夠激進,也許是提取過程)。如果持久性機制發生變化,您只需彈出一個新的Load層。根據您的對象圖的複雜性,以及Transform和Validate階段的複雜性,我認爲您一定會發現這樣可以很好地處理十萬條記錄。

+0

哇。這與我的想法截然不同,但似乎是一個非常好的主意。如果系統讓我(我需要積分?),我會給你一個投票。我很困惑的一點是,在這個系統中如何跟蹤記錄有一些字段無效的記錄總數,以及如何從系統中獲取信息並說出登錄在數據庫表中或通過電子郵件發送到必要的人? – Arlen 2010-10-22 15:33:53

+0

那麼,您的驗證階段將向其主管(或者某個度量生成類)報告「有效/無效」,或者它會告訴加載器將一個表中的有效值保存到一個表中,將無效的保存到另一個包含信息的表中爲什麼失敗。然後,您可以查詢「失敗」表以獲取因某個問題而失敗的記錄數。 – KeithS 2010-10-22 18:16:11