我在同一个公司网络上有许多 WPF 客户端。我希望这些客户端彼此共享消息。我不想运行单独的服务器进程,因此无代理解决方案似乎是最好的。我考虑过使用 PNRP,但这似乎需要在每个客户端上运行 PNRP 服务,我不确定我能否保证所有客户端都会或可能运行它。我还查看了 ZeroMq,它看起来很简单,而且非常轻量级,但是我需要知道 TCP/IP 风格通信的端点,并且每个客户端都不会知道其他客户端,而是他们需要以某种方式去发现彼此。
所以我想问题是有没有我认为不符合要求的选项?
提前感谢您的帮助。
ZeroMQ pub-sub 模式简单快捷,直到您接触到数百个客户端;您可以切换到真正的多播协议(PGM),而无需修改您的应用程序。
也许您应该查看NServiceBus。它是真正的服务总线,因此中间没有代理机器。它在 MSMQ 上运行,因此您的 Windows 服务器将立即支持它。它还支持事务消息传递。它还支持应该满足您的多播要求的发布/订阅模型。
如果您不介意使用商业产品:OMG 的数据分发服务是一个标准,具有多种实现,可以满足您的需求。其中至少有一个支持 C#,并且不需要在你的机器上安装任何东西——只需要库。披露:我在这家公司工作。
所以本质上我想要一种多播的通信方式,但不必使用多播,因为这将需要我在公司网络中设置一系列地址并涉及基础设施等。
默认情况下,DDS 使用 UDP/IP over 多播进行发现和通信,但可以通过编程或配置文件指示仅使用 UDP over unicast 或 TCP。这不会影响应用程序逻辑,因此保留了概念多播性质。但是,如果您没有可用的 IP 多播,那么您将失去一些开箱即用的自动发现功能。在这种情况下,您需要提前知道可能参与通信的所有节点的 IP 地址或主机名。从那里,中间件将能够发现其中谁实际存在并相应地调整其通信。
我认为后者对于您选择的任何解决方案都是正确的。对于全自动发现,您将需要多播/广播,或在您的系统中运行一些已知的发现服务器。
我们基于 ZeroMQ(传输)、Cassandra(对等发现和持久性)和 Protobuf(序列化)编写了对等消息总线 Zebus。
它是开源和生产测试的https://github.com/Abc-Arbitrage/Zebus
Zebus 正在积极开发中,并在大量内部生产中使用。目前只有 .NET 语言绑定,但正如 OP 提到的,他只有 WCF 客户端,这应该可以满足他的需求。
您是否考虑过 WCF 的点对点协议?有关详细信息,请参见此处:http: //msdn.microsoft.com/en-us/library/cc297274.aspx
ZeroMQ 是一个不错的选择。为了解决发现问题,站一个服务器,每个客户端在启动和停止时都会检查。该服务器也可以作为发布者和订阅者运行 ZeroMQ。
客户端发布到服务器上的一个端口,该端口将订阅者绑定到该端口以获取签入和签出消息。服务器反过来将这些消息发布到客户端订阅的另一个端口(它也绑定)上。