我有一个在Windows服务中运行的类库。该库运行时间很长,可以轮询电子邮件(可以分解为任务),处理消息等,并且运行良好。

这是产品的一部分,需要通过添加节点来扩展。我目前定义单个节点处理哪些客户。

我的问题是,如果该节点发生故障或需要维护,则需要手动干预,并且在停机期间数据会丢失。我想提出一个解决方案,使其能够像负载平衡的Web服务器一样工作。如果节点出现故障,应用程序可以看到并采取适当措施。

它基于C#/ .NET和MS SQL Server构建,并希望坚持使用这些技术。

我意识到这可能不像我的问题那么简单,但是我正在寻找可能存在的任何设计模式或最佳实践来帮助我构建解决方案。

最佳答案

1)使每个已安装的Windows服务使用unique id在数据库中注册自己。

2)在您的服务运行期间,发送心跳。此心跳可以像对服务上次签入日期的DateTime字段进行更新一样简单。您可以直接在数据库中更新字段,也可以通过Web服务进行更新。

3)创建一个表,该表定义一组任务以及正在执行该任务的计算机的分配的unique_id。这可以先到先得。机器可以选择自己选择的任何任务,并且通过在此表中进行注册来获得该任务的专有权。与集中控制相比,我更喜欢这种方法,因为您不必担心中央控制器出现故障时任务不会运行。

4)定义心跳的超时值。您的每个分布式服务都将检查尚未拾取或超时的任务。任何执行任务的机器的心跳维护都不应取决于任务花费的时间。也就是说,如果任务A花费5分钟,则MachineA仍应在那5分钟内更新其心跳,以便MachineB不会将其标记为已关闭。

5)根据任务的复杂程度,您可能需要工作人员更新的状态列。

关于c# - 分布式窗口服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9677814/

10-11 02:13
查看更多