我有一个在 Windows 服务中运行的类库。这个库有长时间运行的线程来轮询电子邮件(可以分解成任务)、处理消息等,并且运行良好。
这是需要通过添加节点来横向扩展的产品的一部分。我目前定义哪些客户由单个节点处理。
如果该节点出现故障或需要维护、需要手动干预并且数据在停机期间丢失,我的问题就会出现。我想提出一个解决方案,让它像负载平衡的 Web 服务器一样工作。如果一个节点出现故障,应用程序可以看到并采取适当的行动。
这是基于 C#/.NET 和 MS SQL Server 构建的,并希望坚持使用这些技术。
我意识到这可能不像我的问题看起来那么直截了当,但我正在寻找可能存在的任何设计模式或最佳实践来帮助我构建解决方案。
最佳答案
1) 让每个已安装的 Windows 服务使用 unique id 在数据库中注册自己.
2) 当您的服务处于事件状态时,发送心跳。此检测信号可以像更新服务上次 checkin 时间的 DateTime 字段一样简单。您可以直接在数据库中更新字段或通过 Web 服务。
3) 创建一个表来定义一组任务,以及为执行该任务的机器分配的 unique_id。这可以是先到先得。一台机器可以选择它选择的任何任务,并且它通过在这个表中注册自己来获得对该任务的专有权利。与集中控制相比,我更喜欢这种方法,因为您永远不必担心集中 Controller 出现故障时任务无法运行。
4) 为心跳定义一个超时值。您的每个分布式服务都将检查未被拾取或超时的任务。任何执行任务的机器的心跳维护不应取决于任务花费的时间。也就是说,如果任务 A 需要 5 分钟,机器 A 仍应在这 5 分钟内更新其心跳,以便机器 B 不会将其标记为已关闭。
5) 根据您的任务的复杂程度,您可能需要工作人员更新的状态列。
关于c# - 分布式窗口服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9677814/