如何将gen_server / gen_fsm从节点传输到节点

时间:2012-03-06 11:21:13

标签: erlang gen-server gen-fsm

我想知道将gen_server / gen_fsm从erlang节点A移动到erlang节点B以保持其内部状态的建议方式(如果有的话)。

1 个答案:

答案 0 :(得分:1)

AFAIK没有办法在erlang节点之间传输进程,我可以考虑许多理由禁止这个,在其他人之间你可能会弄乱内部节点内存,只需考虑一个保存数据的进程(除了在内部'状态'循环参数)在进程字典(进程堆),二进制(不同的垃圾收集方法)。

一种解决方法可能是为gen_fsm / gen_server提供一种方法,该方法可以生成在服务器/状态机的内部状态同时重新创建的新进程。 我认为要实现起来更难,你可以简单地使用两个启动函数:

  • 初始化行为的人(就像我认为你现在正在做的那样)
  • 同时接受节点并通过远程方法启动的节点调用该节点上的服务器并初始化状态(通过init / 1函数或通过发送消息,即服务器的状态以明确的方式)

但我必须说,我在这里看到两个主要问题:

  • 同步:需要确保进程:在远程节点上启动服务器 - >设置远程服务器状态 - > kill当前本地服务器是原子的
  • Coherence:引用本地进程的其他进程必须将其引用切换为远程进程

前者可以通过多种方式解决(我的两分钱:在本地和远程服务器之间传递显式消息 - 开销但考虑到Erlang运行时系统的防弹),后者可以通过监视器/链接和退出返回值来解决(远程服务器pid)或以更优雅的方式使用带有gen_event进程的发布/订阅模型。

我希望您发现这对解决您的问题非常有用,如果您需要,可以提出任何问题!