我一直在研究移动代理,并且想知道是否有可能将正在运行的进程发送到erlang中的另一个节点。我知道可以在另一个节点上发送一个消息进程。我知道可以在集群中的所有节点上加载模块。是否可以将特定节点上某个状态的进程移动到另一个节点并恢复其状态。也就是说,erlang能提供强大的移动性吗?或者是否有可能在erlang中提供强大的移动性?
答案 0 :(得分:10)
是的,这是可能的,但没有“将流程移动到节点”调用。但是,如果进程是使用迁移功能构建的,那么您当然可以通过将进程的功能及其状态发送到另一个节点并在那里安排生成来实现。要正确获取流程的标识,您需要使用全局流程注册表或gproc,因为流程将更改 pid 。
还有其他一些注意事项:进程可能正在使用其数据不存在于另一个节点上的ETS表,或者它可能在进程字典中存储了内容(从随机模块中可以看到状态)。 / p>
Erlang的普遍共识是,流程不会动员在机器之间移动。相反,如果节点死亡,则要么在节点之间安排接管应用程序。或者为了分发系统,所以数据已经分发到另一台机器。在任何情况下,在发生错误时使状态持久的主要问题仍然存在,移动性与否 - 并且分发是解决持久性问题的一个很好的工具。