2010-10-22 76 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