我在使用主/从设置开发的高可用性 Windows 服务中遇到问题。
上下文:
服务本身将数据同步到两个端点。一个端点同步到本地数据库,一个是外部的。本地数据库在两台机器上都是重复的,因此主从都需要同步它。外部端点只需同步一次。
Master默认会同步到外部服务,slave会在master宕机时接管。当master回去,slave还在对外同步时,master会要求slave完成一部分工作,然后告诉master完成了,让他继续剩下的工作。
所有这些都需要异步发生,我不希望程序停止并等待另一个响应(就像从机仍在处理数据)。
我已经为此实现了所有逻辑。
设置:
在两台不同的机器上运行的两个 Windows 服务。 目前,通信是通过命名管道完成的。
问题:
命名管道对于正在完成的吞吐量来说不够可靠。它也经常崩溃,并且不是为重新连接/关闭和重新打开很多次而设计的。我还面临发送/接收消息时它只是“挂起”很多的问题。重试有时有效,但我认为我不应该重试。我需要在两个实例之间建立可靠的通信。
解决方案:
我一直在寻找命名管道的替代方案,但似乎找不到我确信可行的解决方案。主要是因为很多技术都是通过 http 在服务和客户端之间进行通信。
基于 MSMQ 的 WCF 也不是我所需要的,因为我只希望在两者都在线时进行通信。 WCF 通常也更专注于一个端点接收数据和发送响应。我需要双向通信,因此两个实例都需要能够随时接收和发送消息。
我认为我最好的选择是 SignalR,但我也不相信。
最佳答案
你看过MassTransit了吗?在 RabbitMQ ?
几年来,我们一直非常成功地将它们一起用于服务内通信和客户端/服务通信。
关于c# - .NET 中服务之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47290204/