C# 可扩展性和可用性

C# 可扩展性和可用性,c#,scalability,high-availability,C#,Scalability,High Availability,我很困惑应该采取哪种方法,什么是最佳实践。 假设我有一个C#应用程序,它执行以下操作: 从队列发送电子邮件。发送电子邮件,所有内容都存储在数据库中 现在,我知道如何使我的C#应用程序几乎可伸缩,但我需要更进一步 我想要某种形式的责任,能够将任务分布到X服务器上。因此,不只是一台服务器完成所有处理,而是在所有服务器之间共享。 如果一台服务器停机,则负载在其他服务器之间共享。我知道NLB可以做到这一点,但我不在这里寻找NLB 当然,可以在DB表中添加某种类型的列来指示应该分配哪个服务器来处理该记录,

我很困惑应该采取哪种方法,什么是最佳实践。 假设我有一个C#应用程序,它执行以下操作:

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

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

我想要某种形式的责任,能够将任务分布到X服务器上。因此,不只是一台服务器完成所有处理,而是在所有服务器之间共享。 如果一台服务器停机,则负载在其他服务器之间共享。我知道NLB可以做到这一点,但我不在这里寻找NLB

当然,可以在DB表中添加某种类型的列来指示应该分配哪个服务器来处理该记录,并且服务器上的每个应用程序都有某种与DB中的值相匹配的ID,它们只会拉他们自己的记录-但是我认为这是便宜的、不好的实践和不现实的。p> 由于潜在的死锁和其他可能的问题,我也不会使用DB表行锁

我也没有在这里指出使用线程“到极致”,但是是的,每个要处理的项目都会有线程,或者每个线程都会批处理x个线程

对于制作一个可扩展且具有高可用性的C#应用程序,我应该如何处理?您有何建议?其目的是要有X台服务器,每个服务器都有相同的应用程序,每个服务器都能够获取记录并处理它们,但处理/处理项目的级别在服务器之间是共享的,因此,如果一台服务器或服务出现故障,另一台服务器可以承担该负载,直到另一台服务器恢复


很抱歉,我缺乏理解或知识,但我一直在思考这个问题,并且在尝试想出一个好的、健壮的解决方案时睡眠不足。

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

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


这可能不足以满足您的口味,但我敢打赌,在企业中有很多应用程序同样不复杂,而且工作正常。最好的东西以最少的复杂性工作。

我会考虑分批工作,因此每个应用程序一次只提取x个记录,将检索到的记录标记为表中的bool字段。我会修改SELECT语句,只提取未标记为已完成/已完成的记录。在这种情况下,表锁可以在很短的时间内使用,以确保处理相同记录的应用程序没有重叠。谢谢Tom,但这正是我想要避免的。例如,如果服务获取x个记录并将其标记为“进行中”,那么在处理过程中它会崩溃……那么这些记录永远不会脱离“进行中”状态。我不希望这个问题发生。还认为另一个“监视器”服务应该在x小时前查看一条记录是否已被处理,这也是非常糟糕的设计和更令人头疼的维护问题。@Ahmedilyas,如果你要将所有可能的解决方案都斥为“糟糕的设计”,你不会走得很远。哈哈。我知道你的意思,但我在找一种强壮的东西。我不是把每一个解决方案都写下来,但我发现它有问题。。。。这根本不符合目的。你有什么解决办法?我所发表的评论是完全正确的,并没有任何不尊重的意思。我说的是企业类型的可伸缩性和可用性。您如何摆脱服务选择x记录并将其标记为“正在进行”,然后在服务器崩溃的中途进行的情况?你怎样才能真正康复?你不能,不是全部。