我正在寻找有关如何扩展目前在我公司运行的 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 到数百之间变化。
- 消息有一堆其他集合和其他关系,但它们与问题无关。
今天,我们几乎没有管理 16 核服务器上的负载的 Windows 服务(我不记得完整的规格,但可以肯定地说这台机器是野兽)。我的任务是找到一种方法来扩展和添加更多机器,这些机器将处理所有这些数据并且不会干扰其他实例。
目前,每条消息都有自己的线程并处理相关报告。我们分批处理报告,按其 MessageId 分组,以在处理数据时将数据库查询的数量减少到最低限度。
限制
- 在这个阶段,我可以使用我认为合适的任何架构从头开始重写此服务。
- 如果一个实例崩溃,其他实例需要能够从崩溃的一个离开的地方接起。不会丢失任何数据。
- 从插入数据库的报告开始,此处理需要尽可能接近实时。
我正在寻找有关如何构建这样一个项目的任何意见或建议。我认为服务需要是无状态的,或者有没有办法以某种方式同步所有实例的缓存?我应该如何在所有实例之间进行协调并确保它们不处理相同的数据?如何在它们之间平均分配负载?当然,如何处理实例崩溃而不完成它的工作?
编辑
删除无关信息