Erlang 如何在节点之间传输gen_服务器/gen_fsm

Erlang 如何在节点之间传输gen_服务器/gen_fsm,erlang,gen-server,gen-fsm,Erlang,Gen Server,Gen Fsm,我想知道将gen_服务器/gen_fsm从erlang节点a移动到erlang节点B以保持其内部状态的建议方法(如果有)是什么。AFAIK没有办法在erlang节点之间传输进程,我可以考虑许多禁止这样做的原因,在其他节点之间,您可能会弄乱内部节点内存,简单地考虑在进程字典(进程堆)、二进制(不同垃圾收集方法)中保存数据(而非内部状态“循环参数”)的过程。 一种解决方法是为gen_fsm/gen_服务器提供一种方法,该方法可以生成一个新进程,同时重新创建服务器/状态机的内部状态。 我认为更难说的是

我想知道将gen_服务器/gen_fsm从erlang节点a移动到erlang节点B以保持其内部状态的建议方法(如果有)是什么。

AFAIK没有办法在erlang节点之间传输进程,我可以考虑许多禁止这样做的原因,在其他节点之间,您可能会弄乱内部节点内存,简单地考虑在进程字典(进程堆)、二进制(不同垃圾收集方法)中保存数据(而非内部状态“循环参数”)的过程。

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

  • 一个初始化行为(就像我认为你现在正在做的那样)
  • 同时获取一个节点并通过远程方法启动的节点调用该节点上的服务器并初始化状态(通过init/1函数或通过发送消息以明确的方式,即服务器的状态)
但我必须说,我在这里看到两个主要问题:

  • 同步:需要确保以下过程:在远程节点上启动服务器->设置远程服务器状态->杀死当前本地服务器是原子的
  • 一致性:引用本地进程的其他进程必须将其引用切换到远程进程
前者可以通过多种方式解决(我的两分钱:本地和远程服务器之间的显式消息传递-开销很大,但考虑到Erlang运行时系统,它是防弹的),后者可以通过监视器/链接和退出返回值(远程服务器pid)来解决或者以更优雅的方式使用带有gen_事件进程的发布/订阅模型


我希望你觉得这对解决你的问题很有用,如果你需要,可以问任何问题

>Pa>AfAIK,在Erlang节点之间不可能传输一个进程,我可以考虑很多理由禁止这样做,在其他可能会与内部节点内存混淆的情况下,简单地考虑在进程字典(进程堆)中保存数据(而不是内部状态“循环参数”)的过程,二进制。(不同的垃圾收集方法)

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

  • 一个初始化行为(就像我认为你现在正在做的那样)
  • 同时获取一个节点并通过远程方法启动的节点调用该节点上的服务器并初始化状态(通过init/1函数或通过发送消息以明确的方式,即服务器的状态)
但我必须说,我在这里看到两个主要问题:

  • 同步:需要确保以下过程:在远程节点上启动服务器->设置远程服务器状态->杀死当前本地服务器是原子的
  • 一致性:引用本地进程的其他进程必须将其引用切换到远程进程
前者可以通过多种方式解决(我的两分钱:本地和远程服务器之间的显式消息传递-开销很大,但考虑到Erlang运行时系统,它是防弹的),后者可以通过监视器/链接和退出返回值(远程服务器pid)来解决或者以更优雅的方式使用带有gen_事件进程的发布/订阅模型


我希望这对解决您的问题很有用,如果您需要,可以询问任何问题!

嗨,谢谢您的回复。事实上,我只需要将一个gen_fsm移动到另一个保持其状态的节点。它还应该从节点a的管理器中删除自己,并将自己添加到节点B的管理器中。这给我带来了一些麻烦,因为在很短的时间内,我我想,你的主管策略是什么?如果是一对一,你可以毫无问题地删除进程并将其添加到树中。关于进程不受监督的失误,我在上面称之为“原子”操作。你可以有一个过程来监听这两个进程,并在只有在迁移过程成功完成的情况下,您才应该考虑可能发生的状态更改(您必须绝对遵守!!!)。1)是的,一对一2)我能想到的最简单的解决方案是,新生成的gen_fsm在向主管注册后将向原始的gen_fsm发送呼叫。仅当您以同步方式(即通过本地服务器中的一系列发送/接收)退出第一个实例以确保所有操作(启动远程服务器、对齐状态、注册远程服务器/对齐全局名称引用、退出本地服务器)的原子性时,调用才会触发第一个实例以正常方式退出。否则,您可能会遇到竞争情况,即在操作开始和结束之间发生本地服务器状态更改。您好,感谢您的回复。事实上,我只需要将gen_fsm移动到另一个保持其状态的节点。它还应该从节点A的监控程序中删除自己,并将自己添加到节点B的监控程序中。这给我带来了一些麻烦,因为在很短的时间内,它不会被监控。我想……您的监控程序策略是什么?如果是一对一,则可以删除进程并将其添加到树中,而不会出现问题。关于流程不受监督的失误,我在上面称之为“原子”操作。如果且仅当迁移过程成功完成时,您可以拥有一个侦听两个进程并终止本地进程的过程,但您应该考虑可能的状态更改(您必须绝对遵守!!!)。1)是,一对一2)我能想到的最简单的解决方案是,新产生的gen_fsm在向主管注册后将向原始fsm发送呼叫。该调用将触发第一个实例