可扩展性和可用性

时间:2012-04-22 12:01:07

标签: c# scalability high-availability

我对采取哪种方法以及最佳做法感到困惑。 假设我有一个C#应用程序执行以下操作:

从队列发送电子邮件。要发送的电子邮件和所有内容都存储在数据库中。

现在,我知道如何使我的C#应用​​程序几乎可扩展,但我需要更进一步。

我希望能够在X服务器之间分配任务。因此,不只是一台服务器在进行所有处理,而是在服务器上共享它。 如果一台服务器出现故障,则负载在其他服务器之间共享。我知道NLB会这样做,但我不是在这里寻找NLB。

当然,您可以在数据库表中添加某种类型的列,以指示应该分配哪个服务器来处理该记录,并且服务器上的每个应用程序都将具有某种类型的ID,该ID与数据库和他们只会拉自己的记录 - 但我认为这是便宜,不好的做法和不切实际的。

由于潜在的死锁和其他可能的问题,我也不会执行数据库表行锁定。

我也没有在这里指出使用“极端”线程,但是,每个项目都会有线程处理或为每个线程批量处理x个线程。

我应该如何处理以及建议您制作可扩展且具有高可用性的C#应用​​程序?目标是拥有X服务器,每个服务器具有相同的应用程序,并且每个服务器都能够获取记录并处理它们,但是如果一个服务器或服务发生故障,那么服务器处理共享的处理/项目的级别就会增加可以承担该负载,直到另一台服务器被放回。

很抱歉,我缺乏理解或知识,但一直在考虑这个问题,并且在考虑一个好的强大解决方案时缺乏睡眠。

1 个答案:

答案 0 :(得分:1)

我会考虑批量处理工作,因此每个应用程序一次只撤回x个记录,将那些检索到的记录标记为表中的bool字段。我将修改SELECT语句以仅提取未标记为已完成/已完成的记录。在这种情况下,表锁可以在很短的时间内完成,以确保处理相同记录的应用程序没有重叠。

编辑:这不是很优雅,但你可以为每个条目设置一个日期戳和状态(而不是上面的bool字段)。然后,您可以运行定期代理作业,该作业运行sproc以重置状态为“正在进行”但已超出时间阈值而未设置为完成的任何记录的状态。他们可以在以后通过另一个应用程序进行再处理。

对于你的口味来说,这可能不够企业,但我敢说我的隐藏,企业中有很多应用程序,这些应用程序同样不复杂,工作得很好。最好的事情是复杂性最小的。