我有一个 .Net 核心应用程序,它由一些后台任务(托管服务)和 WEB API(控制和获取这些后台任务的状态)组成。其他应用程序(例如客户端)通过这些 WEB API 端点与该服务进行通信。我们希望该服务具有高可用性,即如果一个服务崩溃,那么另一个实例应该自动开始工作。此外,客户端应用程序应该能够自动切换到下一个服务(客户端应该调用新实例的 API,而不是旧实例)。
另一个重要要求是该服务在后台执行的任务(计算)不能在两个实例之间共享。我们必须确保在给定时间只有一个实例执行此任务。
到目前为止我所做的是,我运行了同一服务的两个实例,并使用基于 SQL 服务器的分布式锁定机制 ( SqlDistributedLock ) 来获取锁。如果服务可以获取锁,则在其他节点等待获取锁时继续执行操作。如果一个服务崩溃,下一个节点可以获取锁。在客户端,我使用基于Polly的重试机制将调用 URL 切换到下一个节点以找到工作节点。
但是这种设计有一个问题,如果获得锁的节点失去了与 SQL 服务器的连接,那么第二个服务设法获得锁并开始工作,而第一个服务也在做同样的事情。
我想我需要一些寻求领导人选举(似乎做错了),谁能帮助我更好地解决这类问题?