5

原帖

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

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

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

我试过使用像SuperPoolScs这样的 RMI 库,但是它们有一些基本问题:

  • SCS 仅支持 Server --> Client 或 Client --> Server 通信,不支持 Client --> Client 通信。
  • 据我所知,SuperPool 只支持相同的,虽然这张图片会暗示其他情况,但我在文档中找不到任何关于如何执行此操作的内容: 在此处输入图像描述

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

你会建议我如何实现这个(也许使用这些现有的解决方案作为基础),或者是否有其他一些现有的解决方案可能有效?

更广泛的例子

这是我正在尝试做的图表: 在此处输入图像描述

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

过程:

  1. Client1 连接到服务器
  2. Client2 连接到服务器
  3. Client1 调用 Client2 上的一个方法,而不知道 Client2 的组件是否存在于服务器、另一个客户端或它自己上。

这个想法与 SuperPool 所做的相同,除了允许 Client --> Server --> Client 通信路径来调用第二个客户端上的方法。

4

2 回答 2

3

虽然ZeroMQ级别很低,但它支持双向通信支持 .NET可在 nuget.org 上获得

您可以在 DEALER/ROUTER 或 DEALER/DEALER 套接字对上多路复用许多双向对话,并且任何一方都可以发起对话。

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

Salt 和 Cloudless 都建立在 ZeroMQ 之上,提供远程方法调用。

ZeroMQ 促进了非常健壮的异步套接字(以及更多) 路由消息绝对是可能的。如果您将ZeroMQ 指南中的 Ventilator 和 Sink结合起来, 您将非常接近您想要完成的任务。

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

于 2013-05-12T06:30:29.997 回答
0

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

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

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

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

于 2013-05-12T11:09:23.670 回答