我应该如何在.NET中实现分布式远程方法调用系统?

时间:2013-05-12 01:10:19

标签: c# .net tcp udp rmi

原帖

我如何实现分布式远程方法调用系统?

我正在尝试创建以下内容:

  • 主服务器,用于跟踪各个“主机”。
  • 主机可以使用基于代理对象接口的编程风格与网络上的其他主机通信,例如:var result = remoteHost.MyMethod(5);

我尝试过使用SuperPoolScs之类的RMI库,但它们有一些基本问题:

  • SCS仅支持服务器 - >客户或客户 - >服务器通信,没有客户端 - >客户沟通。
  • 据我所知,SuperPool只支持相同,虽然这张图片会另有说明,但我在文档中找不到有关如何执行此操作的任何内容: enter image description here

不同之处在于客户端上的任何组件也可以与其他客户端上的组件通信,而不是仅与客户端 - >服务器或服务器 - >客户端通信。

您如何建议我实施此项目(可能使用这些现有解决方案作为基础),还是有其他现有解决方案可能有效?

更广泛的例子

这是我正在尝试做的图表: enter image description here

重要提示:客户端不会相互连接。

过程:

  1. Client1连接到服务器
  2. Client2连接到服务器
  3. Client1在Client2上调用方法,而不知道Client2的组件是否存在于Server,另一个Client或其自身上。
  4. 这个想法与SuperPool所做的一样,除了允许客户端 - >服务器 - >用于在第二个客户端上调用方法的客户端通信路径。

2 个答案:

答案 0 :(得分:3)

虽然ZeroMQ级别很低,it supports bidirectional communication.NET supportavailable on nuget.org

  

您可以在DEALER / ROUTER上复用许多双向对话   或DEALER / DEALER插座对和任何一方都可以启动   会话。

请注意,尽管ZeroMQ没有准备好进行方法调用的所有内容;您必须创建自己的协议或使用现有协议并实施它。

构建在ZeroMQ之上的

Both Salt and Cloudless提供了远程方法调用。

ZeroMQ facilitates very robust asynchronous sockets (and more) Routing messages绝对是可能的。如果你合并Ventilator and Sink in the ZeroMQ Guide,那么你非常接近你想要完成的事情。

请注意,您仍然需要实现实际的协议和方法调用。

答案 1 :(得分:0)

从粗略看看Superpool,它似乎确实支持所有可能类型的通信。它是消息队列上的RMI层,允许与指定目标或(可能是多个)未命名目标进行同步或异步通信。我承认并不真正理解你的架构是什么。

我在Superpool看到的问题是它将你锁定在.Net中。您的所有组件都必须是.Net,并且所有组件都必须使用Superpool。

处理组件之间的解耦通信的“标准”方式(解耦意味着发送方不一定需要知道接收方是谁),是将所有组件放在消息总线上。 @Erno de Weerd提出了ZeroMQ,这是一种可能的方法,更高级别的选项(虽然更慢)是使用完整的消息队列服务器,如RabbitMQ甚至MSMQ。

缺点是你失去了Superpool(或其他RMI解决方案)的调用语法,并且必须考虑通过通道来回传递消息,而不是在组件上调用方法。