C# 如何在.NET中实现分布式远程方法调用系统? 原职

C# 如何在.NET中实现分布式远程方法调用系统? 原职,c#,.net,tcp,udp,rmi,C#,.net,Tcp,Udp,Rmi,如何实现分布式远程方法调用系统 我正在尝试创建如下内容: 主服务器跟踪单个“主机” 主机可以使用基于代理对象接口的编程风格与网络上的其他主机通信,例如:var result=remoteHost.MyMethod(5) 我曾尝试使用RMI库,如和,但它们有一些基本问题: SCS仅支持服务器-->客户端或客户端-->服务器通信,不支持客户端-->客户端通信 据我所知,Superpol仅支持相同的功能,尽管这张图片可能会提示其他功能,但我在文档中找不到任何关于如何实现此功能的内容: 区别在

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

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

  • 主服务器跟踪单个“主机”
  • 主机可以使用基于代理对象接口的编程风格与网络上的其他主机通信,例如:
    var result=remoteHost.MyMethod(5)
我曾尝试使用RMI库,如和,但它们有一些基本问题:

  • SCS仅支持服务器-->客户端或客户端-->服务器通信,不支持客户端-->客户端通信
  • 据我所知,Superpol仅支持相同的功能,尽管这张图片可能会提示其他功能,但我在文档中找不到任何关于如何实现此功能的内容:
区别在于客户端上的任何组件也可以与其他客户端上的组件通信,而不是仅与客户端-->服务器或服务器-->客户端通信。

您建议我如何实现这一点(可能使用这些现有的解决方案作为基础),或者是否有其他一些现有的解决方案可以工作

更广泛的例子 下面是我尝试做的一个图表:

重要注意事项:客户端之间没有连接

过程:

  • 客户端1连接到服务器
  • 客户端2连接到服务器
  • Client1调用Client2上的方法,而不知道Client2的组件是否存在于服务器、另一个客户端或其本身上
  • 其思想与Superpol所做的相同,只是允许客户端-->服务器-->客户端通信路径用于调用第二个客户端上的方法。

    虽然级别很低,但已经和正在使用

    您可以在经销商/路由器上多路传输多个双向对话 或经销商/经销商插座对,任何一侧都可以启动 对话

    请注意,ZeroMQ并没有随附所有准备就绪的方法调用;您必须创建自己的协议或使用现有协议并实现它

    ,构建在ZeroMQ之上,提供远程方法调用

    这是绝对可能的。如果你结合这些因素,你就非常接近你想要实现的目标


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

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

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

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


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

    我不能说我给出了答案,但部分内容可能会给您一些想法,甚至一些建议plumbing@G.Stoynev酷,,仍在试图弄清楚它的作用,但会看看!我在阅读作者早期版本的《商业对象》一书时遇到了CSLA。我认为它可能会帮助您实现分层应用程序(设计和实施)以及您的需求所针对的运营层。问题不在于双向通信,而在于管理多台主机上的此类通信,所有主机都连接到一个中心“集线器”,这是什么意思“在众多主机上管理此类通信"? ZeroMQ中可以有经销商和路由器。很抱歉,我会进一步调查。没问题,我也不确定我是否理解您的问题。我已经在OP中澄清了我的问题,请再次查看,让我知道ZeroMQ是否可以做到这一点。我喜欢Superpol的实现,但真正的问题是,尽管存在解耦的通信,但对每个客户机可见的唯一“客户机”或组件是您直接连接到的。客户端-->服务器-->客户端之间没有路由。感谢您提供指向其他MQ选项的链接。我会继续研究的。你说的直接连接是什么意思?路由应该是通信网络中最头疼的问题。我的意思是,客户端只连接到服务器,而不是其他客户端。Superpol只允许访问您连接的客户端-据我所知,不可能有一个围绕服务器和两个客户端的池