在远程邮箱处理器之间传递消息?

Posted

技术标签:

【中文标题】在远程邮箱处理器之间传递消息?【英文标题】:Passing messages between remote MailboxProcessors? 【发布时间】:2011-06-18 15:23:27 【问题描述】:

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

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

【问题讨论】:

谁认为这是“离题”?如果你不明白这个问题,请不要干涉它。 ***.com/questions/501656/… 可能会提供一些见解。 也许看看 Windows azure 队列。他们用它来让不同的机器(他们称之为工人角色)相互交谈。您可以做的是在每台机器上都有一个代理,负责与其他机器进行通信以请求工作、通知工作完成等。 @jlezard 很有趣,但我没有使用 Azure。我已经发现我需要建立自己的排队基础设施类型 【参考方案1】:

我认为您将编写自己的例程来序列化消息,将它们传递给进程边界,然后将它们发送到另一端。这还需要一个 ID 系统的实现,其中每个邮箱都有一个 ID,并且进程可以将消息发送到 ID,而不仅仅是 Mailbox.Send。这并不容易,因为本地邮箱能够访问本地内存,而远程邮箱则不能。

我会研究类似 RPyC (http://rpyc.wikidot.com/) 的东西,因为它提供的协议有点像您正在寻找的。​​p>

基本上答案是“不”,没有真正的好方法来做到这一点。

【讨论】:

你知道这在其他有代理的语言中会如何进行吗:Erlang、Scala 和 co?谢谢! 嗯,在 Erlang 中,你没有共享内存。每个“线程”实际上是一个单独的进程。所以当你说pid ! "foo" pid 只是"foo" 被发送到的进程的一个ID。由于没有共享内存,并且进程已经有了 pid,因此联网就像创建 pid 到 IP 映射的字典并根据该信息传递消息一样简单。这种方法的问题是所有的通信都必须通过消息传递来完成,而且目前还涉及到消息的内存副本。就性能而言,这并不总是最好的。我对 Scala 没有任何经验。 我应该澄清一下,Erlang 进程不是 OS 进程,它们是 VM 进程。 Erlang 进程有几百字节的内存开销。操作系统进程的开销在多 KB 范围内。

以上是关于在远程邮箱处理器之间传递消息?的主要内容,如果未能解决你的问题,请参考以下文章

异步消息处理机制

Apache Storm 工作人员之间的高消息传递延迟

在 Apache Camel 中的处理器之间传递值

Activemq中待处理消息和入队计数之间的区别?

Akka 基础概念

使用消息传递接口在 Python 中实现多处理 [关闭]