在远程MailboxProcessors之间传递消息?

11

我正在使用 MailboxProcessor 类来保持做自己事情的独立代理。通常代理可以在同一进程中相互通信,但我希望代理在它们分别位于不同进程甚至不同机器的时候也能相互通信。什么样的机制最适合实现它们之间的通信?是否有一些标准解决方案?

请注意,我正在使用 Ubuntu 实例运行代理。


7
谁将此标记为“不相关”?如果您不明白这个问题,请不要干扰它。 - Mauricio Scheffer
1
https://dev59.com/vXRB5IYBdhLWcg3wz6ad 可能提供一些见解。 - Greg Campbell
也许可以看一下Windows Azure队列。这是他们用来让不同的机器(他们称之为工作角色)相互通信的方式。你可以在每台机器上设置一个代理,负责与其他机器通信,请求工作、通知工作已完成等等。 - jlezard
@jlezard 很有趣,但我没有使用Azure。我已经想出了我需要设置自己的队列基础设施。 - Dmitri Nesteruk
1个回答

3
我认为你需要编写自己的序列化消息例程,将它们传递到进程边界,然后在另一侧进行调度。这还需要实现一个ID系统,其中每个邮箱都有一个ID,进程可以向ID发送消息,而不仅仅是Mailbox.Send。这并不容易,因为本地邮箱将能够访问本地内存,但远程邮箱则不能。
我建议参考类似于RPyC(http://rpyc.wikidot.com/)的东西,因为它提供了类似于您正在寻找的协议。
基本上答案是否定的,没有真正好的方法来做到这一点。

你知道在其他有代理的编程语言中,比如Erlang、Scala等,这个会怎么样吗?谢谢! - jlezard
在Erlang中,您没有共享内存。每个“线程”实际上都是一个单独的进程。因此,当您说pid!“foo”时,pid只是要发送“foo”的进程的ID。由于没有共享内存,并且进程已经具有pid,因此将其网络化就像创建pid到IP映射的字典并基于该信息传递消息一样简单。这种方法的问题在于所有通信都必须通过消息传递完成,并且目前还涉及消息的内存复制。从性能上讲,这并不总是最好的选择。我没有使用Scala的任何经验。 - Timothy Baldridge
我需要澄清的是,Erlang进程不是操作系统进程,它们是虚拟机进程。一个Erlang进程的内存开销只有几百字节。而一个操作系统进程的开销则在几千字节的范围内。 - Timothy Baldridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接