【问题标题】:Architecting a system for bulk processing data with metrics使用指标构建用于批量处理数据的系统
【发布时间】:2010-10-22 14:45:24
【问题描述】:

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

来自各种来源的大量记录(比如一次 100,000 条),但主要是纯文本文件。

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

这样的系统有什么好的设计?最好有事件BadFourDigitCodeEncountered 和事件处理器OnBadFourDigitCodeEncountered 还是有一个更简洁的设计并且易于维护?

(我认为这无关紧要,但我使用 NHibernate 作为我的 ORM,但也许知道这很有用,因为 NHibernate 有很多要挂钩的点?)

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

提前致谢, 阿伦

【问题讨论】:

    标签: .net architecture c#-4.0


    【解决方案1】:

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

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

    转换:获取原始记录数据,将其分解为您关心的字段,并使用字段数据创建一个新的域对象。然后这个对象进入队列,由验证层处理。

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

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

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

    【讨论】:

    • 哇。这与我的想法非常不同,但似乎是一个非常好的主意。如果系统允许我给你投票(我需要积分?)。我感到困惑的一点是,如何在该系统中跟踪某些字段无效的记录总数以及如何将信息从系统中取出并记录在数据库表中或通过电子邮件发送给必要的人?
    • 好吧,你的验证阶段要么向其主管(或某些指标生成类)报告“有效/无效”,要么告诉加载器将有效的保存在一个表中,并且无效一个到第二个,其中包含有关失败原因的信息。然后,您可以查询“失败”表,以获取由于某个问题而失败的记录数。
    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2019-10-16
    • 1970-01-01
    • 2015-12-19
    相关资源
    最近更新 更多