我如何实现分布式远程方法调用系统?
我正在尝试创建以下内容:
var result = remoteHost.MyMethod(5);
我尝试过使用SuperPool和Scs之类的RMI库,但它们有一些基本问题:
不同之处在于客户端上的任何组件也可以与其他客户端上的组件通信,而不是仅与客户端 - >服务器或服务器 - >客户端通信。
您如何建议我实施此项目(可能使用这些现有解决方案作为基础),还是有其他现有解决方案可能有效?
这是我正在尝试做的图表:
重要提示:客户端不会相互连接。
过程:
这个想法与SuperPool所做的一样,除了允许客户端 - >服务器 - >用于在第二个客户端上调用方法的客户端通信路径。
答案 0 :(得分:3)
虽然ZeroMQ级别很低,it supports bidirectional communication且.NET support且available 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解决方案)的调用语法,并且必须考虑通过通道来回传递消息,而不是在组件上调用方法。