我在寻找一些关于如何扩展当前在我公司运行的Windows服务的输入。我们使用的是.NET 4.0(能够而且将会在未来的某个时候升级到4.5),并运行此Windows Server 2012的扩展Windows服务
。关于服务
服务的工作就是查询在新行一个日志表(我们正在处理Oracle数据库),处理信息,在其他5个表中创建和/或更新一堆行(让我们称它们为跟踪表),更新日志表并重复。
日志记录表中有大量的XML(每行最多可以有20 MB),需要选择并保存在其他5个跟踪表中。新行一直以每小时500,000行的最大速率添加。
跟踪表的流量要高得多,每小时从最小的90,000个新行到最大表中可能的数百万行不等。更不用说那些表上也有更新操作。
关于数据被处理
我觉得这有点是寻找基于这些对象的分组方式和处理的解决方案非常重要。数据结构是这样的:
public class Report
{
public long Id { get; set; }
public DateTime CreateTime { get; set; }
public Guid MessageId { get; set; }
public string XmlData { get; set; }
}
public class Message
{
public Guid Id { get; set; }
}
- 报告是我需要选择记录数据和流程
- 对于每一个消息平均有五份报告。在一些情况下,这可以在1到数百之间变化。
- 消息有一堆其他集合和其他关系,但它们与问题无关。
今天,我们仅仅管理着一个16核服务器上的负载Windows服务(我不记得完整规格,但它肯定地说这台机器是兽)。我一直致力于找到一种扩展方法,并添加更多机器来处理所有这些数据,而不会干扰其他实例。
当前每条消息都获取它自己的主题并处理相关报告。我们通过MessageId分组处理报告,以便在处理数据时将数据库查询的数量降至最低。
限制
- 在这个阶段允许我重新写这个使用任何架构我认为合适的从零开始的服务。
- 如果一个实例崩溃,其他实例需要能够拾取崩溃的一个离开的位置。没有数据可以丢失。
- 该处理过程需要尽可能接近实时地插入到数据库中的报告。
我正在寻找关于如何建立这样一个项目的任何输入或建议。我假设这些服务需要是无状态的,或者是否有办法以某种方式同步所有实例的缓存?我应该如何协调所有实例并确保它们不处理相同的数据?我如何平均分配负载?当然,如何处理实例崩溃并且不能完成它的工作?
编辑
去掉无关的信息
这听起来像一个ETL过程。您是否考虑过查看SQL Server Integration Services(SSIS)之类的东西,并编写可定期运行以定期执行此过程的软件包? –
不幸的是,我们使用Oracle和更高层的人不想听到有关SQL Server的信息。 – Artless
我只想着它的SSIS部分,而不是数据库引擎:)替代方案将类似Pentaho数据集成(http://www.pentaho.com/explore/pentaho-data-integration/)或Talend etl分析( http://www.talend.com/solutions/etl-analytics) –