2012-03-13 73 views
2

我有一个在Windows服务中运行的类库。这个库有很长的运行线程来轮询电子邮件(可以分解成任务),处理消息等,并运行良好。分布式窗口服务

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

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

这是建立在C#/ .NET和MS SQL Server上,并希望坚持这些技术。

我意识到这可能不像我的问题那么直截了当,但我正在寻找任何设计模式或最佳实践,可能会帮助我构建出解决方案。

回答

3

1)让每个安装的windows服务在数据库中注册本身,其中unique id

2)当你的服务还活着时,发送一个心跳。这种心跳可以与上次登录服务时更新DateTime字段一样简单。您可以直接在数据库中更新字段,也可以通过Web服务。

3)创建一个表,用于定义一组任务以及执行该任务的计算机的分配unique_id。这可以先到先得。一台机器可以选择它所选择的任何任务,并且它通过在该表中注册自己获得该任务的独占权。我更喜欢这种方法,而不是集中控制,因为当您的集中控制器关闭时,您不必担心任务不会运行。

4)定义心跳的超时值。您的每个分布式服务都将检查未被拾取或超时的任务。任何执行任务的机器的心跳维持不应取决于任务需要多长时间。也就是说,如果任务A需要5分钟,则machineA应该在5分钟内更新其心跳,以便machineB不会将其标记为关闭。

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

0

我的设计将是一个中央服务,它将维护和分配工作以及实际处理工作的其他工作服务。所以当有一些工作需要完成时,他们会被添加到中央服务队列中,服务会通知工作人员的服务。接下来,每个工人都会尝试找到一份工作来执行。如果工作分配给工作人员,工作人员将根据工作是否成功或未完成工作来更新工作状态。通过使用这种设计,您可以轻松地扩展到任意数量的工人服务,并且如果一两名工作人员因为工作未完成而不影响其他工作人员,则其他工作人员可以接受并处理它。

+0

感谢您的想法,我想远离中央服务器部分,它仍然保持我的单点故障。 – 2012-03-14 12:23:59

0

我的方法是将该服务分发给多台计算机,并通过PAXOS或类似算法协调服务以处理领导者选举。因此,当一个节点中的服务停止时,其他服务器中的服务可以占据该位置。 以更实用的方式,我肯定会使用Apache Zookeeper来协调领导人选举。