我想知道将 gen_server/gen_fsm 从 erlang 节点 A 移动到 erlang 节点 B 的建议方法(如果有)是什么,以保留其内部状态。
问问题
593 次
1 回答
1
AFAIK 没有办法在 erlang 节点之间传输进程,我可以考虑很多理由来禁止这个,在其他人之间你可能会弄乱内部节点内存,只需考虑一个保存数据的进程(除了在内部“状态”循环中参数)在进程字典(进程堆),二进制(不同的垃圾收集方法)。
一种解决方法可能是为 gen_fsm/gen_server 提供一种方法,该方法可以生成一个新进程,同时重新创建服务器/状态机的内部状态。我认为很难说要实现,您可以简单地使用两个启动函数:
- 一个初始化行为的(就像我认为你现在正在做的那样)
- 一个也需要一个节点并通过远程方法启动的节点调用该节点上的服务器并初始化状态(通过 init/1 函数或通过发送消息以显式方式,即服务器的状态)
但我必须说,我在这里看到了两个主要问题:
- 同步:需要确保进程:在远程节点上启动服务器 -> 设置远程服务器状态 -> 杀死当前本地服务器是原子的
- 连贯性:引用本地进程的其他进程必须将其引用切换到远程进程
前者可以通过多种方式解决(我的两分钱:本地和远程服务器之间的显式消息传递 - 开销但考虑到 Erlang 运行时系统是防弹的),后者可以通过监视器/链接和退出返回值(远程服务器 pid)来解决或者以更优雅的方式使用带有 gen_event 流程的发布/订阅模型。
我希望您发现这对解决您的问题很有用,并在需要时提出任何问题!
于 2012-03-06T13:22:35.500 回答