我有一个在Windows服务中运行的类库。这个库有很长的运行线程来轮询电子邮件(可以分解成任务),处理消息等,并且运行良好。
这是需要通过添加节点进行扩展的产品的一部分。我目前定义了单个节点处理客户的内容。
如果该节点出现故障或需要维护,需要手动干预并且在停机期间数据丢失,我的问题就出现了。我想提出一个解决方案,使其能够像负载平衡的Web服务器一样工作。如果节点发生故障,应用程序可以看到该节点并采取适当的措施。
这是基于C#/ .NET和MS SQL Server构建的,并且希望坚持使用这些技术。
我意识到这可能不像我的问题那样直截了当,但我正在寻找可能会帮助我构建解决方案的任何设计模式或最佳实践。
答案 0 :(得分:3)
1)让每个已安装的Windows服务在unique id的数据库中注册。
2)当您的服务还活着时,发送心跳。此心跳可以像服务上次签入时更新DateTime字段一样简单。您可以直接在数据库中更新字段或通过Web服务。
3)创建一个表,该表定义一组任务,以及正在执行该任务的机器的已分配unique_id。这可以先到先得。机器可以选择它所选择的任何任务,并通过在此表中注册自己获得该任务的专有权。我更喜欢这种方法而不是集中控制,因为当集中控制器出现故障时,你永远不必担心没有运行的任务。
4)定义心跳的超时值。您的每个分布式服务都将检查未被拾取或超时的任务。执行任务的任何计算机的心跳维护不应取决于任务所需的时间。也就是说,如果任务A需要5分钟,则机器A仍应在这5分钟内更新其心跳,以便机器B不会将其标记为已关闭。
5)根据您的任务的复杂程度,您可能需要一个工人更新的状态列。
答案 1 :(得分:0)
我的设计将是一项中央服务,将维护和分配工作,以及实际处理工作的其他工作人员服务。因此,当有一些工作要完成时,它们将添加到中央服务的队列中,该服务将通知工作服务。接下来,每个工作人员都会尝试完成一项工作。如果将作业分配给工作者,则工作人员将根据作业是成功还是不成功来更新作业的状态。通过使用该设计,您可以轻松扩展到任意数量的工作服务,如果一个或两个工作人员因为工作被认为未完成而不影响其余工作,那么其他工作人员可以接收并处理它。
答案 2 :(得分:0)
我的方法是将该服务分发给多台计算机,并通过PAXOS或类似算法协调服务以处理领导者选举。因此,当节点中的服务停止时,其他服务器中的服务可以占用该位置。 我会以更实际的方式使用Apache Zookeeper协调领导人选举。