2012-04-22 109 views
2

我很困惑要采取哪种方法以及最佳实践。 可以说我有一个C#应用程序,它具有以下功能:可伸缩性和可用性

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

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

我希望某种形式的责任能够跨所说的X服务器分配任务。因此,不仅仅是一台服务器执行所有处理,而是在服务器之间共享它。 如果一台服务器出现故障,则负载将在其他服务器之间共享。我知道NLB这样做,但我不想在这里寻找NLB。

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

有一个数据库表行锁为好,是不是我会做,由于潜在的死锁和其他可能的问题。

我还没有使用线程“到了极点”在这里表示,但是,是的,会有每个项目过程线程或配料起来每个线程的线程的X量。

我应该如何处理和建议如何制作可扩展且具有高可用性的C#应用​​程序?其目标是让X服务器具有相同的应用程序,并且每个服务器都能够获取记录并处理它们,但具有处理级别/处理项目以便在服务器或服务发生故障时处于共享状态可以承担该负载直到另一台服务器恢复。

对不起,我缺乏了解或知识,但已经相当很多考虑这个问题有睡眠不足的冥思苦想了良好可靠的解决方案的。

+0

我会想起来批处理工作的,所以每个应用程序一次只能拉回来的记录x个,这标志着这些检索的记录与表中的一个布尔场拍摄。我会修改SELECT语句来只提取未标记为已完成/已完成的记录。在这种情况下,表锁在很短的时间内就可以确保处理相同记录的应用程序没有重叠。 – 2012-04-22 12:09:14

+0

谢谢汤姆,但多数民众赞成我想避免。例如,如果服务占用x个记录并将它们标记为“正在进行”,则在该处理期间它崩溃......则那些记录永远不会处于“进行中”状态。我不想让这个问题发生。另外认为,另一个“监视器”服务应该看看表,看看一个记录是否已经被x小时处理过,设计也很糟糕,而且更多的维护头痛。 – 2012-04-22 12:49:41

+1

@Ahmedilyas,​​如果你打算把所有可能的解决方案都视为“糟糕的设计”,那么你不会走得太远。 – svick 2012-04-22 14:45:34

回答

1

我会想起来批处理工作的,所以每个应用程序一次只能拉回来的记录x个,这标志着这些检索的记录与表中的一个布尔场拍摄。我会修改SELECT语句来只提取未标记为已完成/已完成的记录。在这种情况下,表锁在很短的时间内就可以确保处理相同记录的应用程序没有重叠。

编辑:这不是很优雅,但你可以有每个条目的日期戳和状态(而不是上述的布尔字段)。然后,您可以运行周期性的代理作业,该作业运行sproc以重置状态为“进行中”但超出时间阈值但未设置完成的任何记录的状态。他们稍后将准备好通过另一个应用程序进行后处理。

这可能不是企业-Y满足你的口味,但我敢打赌,我的皮,有大量的应用程式赫然出现在其中只是作为联合国复杂的工作就好了企业。最好的事情是以最小的复杂度工作。