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