构建一个使用指标批量处理数据的系统

时间:2010-10-22 14:45:24

标签: .net architecture c#-4.0

我正在寻找关于如何构建这样一个系统的想法:

记录从各种来源批量(一次说100,000个),但主要是平面文本文件。

此数据需要按原样推送到SQL Server数据库表中。但是,需要计算各种指标。例如,一个字段是某个4位代码。只有某些4位数代码有效,我们需要跟踪使用错误的4位数代码到达的记录数。还有其他字段需要“验证”,字段列表将来可能会发生变化。

这种系统的优秀设计是什么?是否最好有事件BadFourDigitCodeEncountered和事件处理器OnBadFourDigitCodeEncountered,还是有更清洁的设计,可以在以后轻松维护?

(我觉得它不应该重要,但我使用的是NHibernate作为我的ORM但也许这有用,因为NHibernate有各种要点可以挂钩?)

我应该提一下:使用C#.NET 4.0。

提前致谢, 阿伦

1 个答案:

答案 0 :(得分:2)

对于大多数高容量的文件到数据库进程,我将其构建为ETVL(提取 - 转换 - 验证 - 加载)工作流。

提取:打开文件,获取数据行并将它们放入队列中以供转换层处理。

转换:抓取原始记录数据,将其打包到您关心的字段中,并使用字段数据创建新的域对象。然后该对象进入队列以由验证层处理。

验证:通过一系列业务规则运行您的域对象,以确保记录处于有效,一致的状态。有效对象被标记为这样(通过将它们放在“好”队列中,或者将它们包装在一个包含对象和标志的简单类中,然后将它们放入队列中)并放在加载器的最后一个队列中。您可以在每个批次中计算您的指标,或者您可以通过将“失败”记录放在另一个表中来实时获取指标,错误代码描述错误,并在闲暇时查询一批或多个数字和原因

加载:将域对象保留到系统的数据库中。

这些阶段中的每一个都应该是单独的方法,甚至是类,由“主管”流程管理。这种设计的美妙之处在于其可扩展性;如果您最终得到大量的验证或转换逻辑,这会降低进程的速度,您可以非常轻松地修改主管以多线程处理这些阶段,在您需要的地方添加额外的处理器能力。它也是模块化的;如果文件格式发生变化,您只需要更改流程的转换阶段(如果更改足够激进,则可能是提取)。如果持久性机制发生更改,则只需弹出一个新的Load层。根据对象图的复杂程度,以及Transform和Validate阶段的复杂性,我认为你会发现它能够一次处理数十万条记录。