【发布时间】:2013-01-19 15:46:37
【问题描述】:
我正在寻找有关如何扩展我公司当前正在运行的 Windows 服务的意见。我们正在使用 .NET 4.0(可以并且将来会升级到 4.5)并在 Windows Server 2012 上运行它。
关于服务
该服务的工作是查询日志表中的新行(我们正在使用 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; }
}
- 报告是我需要选择和处理的日志数据
- 对于每条消息,平均有 5 个报告。在某些情况下,这可以在 1 到数百之间变化。
- Message 有一堆其他的集合和其他关系,但它们与问题无关。
今天,我们几乎没有 Windows 服务管理 16 核服务器上的负载(我不记得完整的规格,但可以肯定地说这台机器是野兽)。我的任务是找到一种方法来扩展和添加更多机器,这些机器将处理所有这些数据并且不会干扰其他实例。
目前每条消息都有自己的线程并处理相关报告。我们分批处理报告,按其 MessageId 分组,以在处理数据时将数据库查询的数量减少到最低限度。
限制
- 在这个阶段,我可以使用我认为合适的任何架构从头开始重写此服务。
- 如果一个实例崩溃,其他实例需要能够从崩溃的一个离开的地方接起。不会丢失任何数据。
- 从插入数据库的报告开始,此处理需要尽可能接近实时。
我正在寻找有关如何构建这样一个项目的任何意见或建议。我认为服务需要是无状态的,或者有没有办法以某种方式同步所有实例的缓存?我应该如何在所有实例之间进行协调并确保它们不处理相同的数据?如何在它们之间平均分配负载?当然,如何处理实例崩溃而不完成它的工作?
编辑
删除了无关信息
【问题讨论】:
-
这听起来像一个 ETL 过程。您是否考虑过查看 SQL Server Integration Services (SSIS) 之类的东西并编写可以安排运行以定期执行此过程的包?
-
不幸的是,我们使用Oracle,高层不想听到任何关于SQL Server的消息。
-
我只考虑它的 SSIS 部分,而不是数据库引擎 :) 替代方案可能是 Pentaho Data Integration (pentaho.com/explore/pentaho-data-integration) 或 Talend etl analytics (talend.com/solutions/etl-analytics)
标签: c# windows-services scalability horizontal-scaling