.NET 中服务之间的通信

Communication between services in .NET

我在使用 master/slave 设置开发的高可用 Windows 服务中遇到问题。

上下文:

服务本身将数据同步到两个端点。一个端点同步到本地数据库,一个是外部的。本地数据库在两台机器上都是重复的,因此主从都需要同步它。外部端点只需同步一次。

Master默认会同步到外部服务,slave会在master宕机时接管。当master回去,slave还在对外同步的时候,master会要求slave完成一部分工作,然后告诉master完成了,让他继续剩下的工作。

这一切都需要异步发生,我不希望程序停止并等待另一个响应(就像从机仍在处理数据)。

我已经实现了所有的逻辑。

设置:

两个 Windows 服务 运行 在两台不同的机器上。 目前通信是通过命名管道完成的。

问题:

命名管道对于正在完成的吞吐量来说不够可靠。它也经常崩溃,并且不是为 reconnecting/closing 而重新打开很多次。我还面临这样的问题,即当 sending/receiving 消息时它只是 'hangs' 很多。重试有时有效,但我认为我不应该重试。我需要在两个实例之间建立可靠的通信。

解法:

我一直在寻找命名管道的替代方案,但似乎找不到我确信可行的解决方案。主要是因为很多技术都是通过 http 在服务和客户端之间进行通信。

MSMQ 上的 WCF 也不是我所需要的,因为我只希望在两者都在线时进行通信。 WCF 通常也更专注于一个端点接收数据和发送响应。我需要双向通信,因此两个实例都需要能够随时接收和发送消息。

我认为我最好的选择是 SignalR,但我也不相信。

你看过MassTransit over RabbitMQ了吗?

几年来,我们一直非常成功地将它们用于内部服务和 client/service 通信。