启动远程 Erlang 节点
Posted
技术标签:
【中文标题】启动远程 Erlang 节点【英文标题】:Starting remote Erlang nodes 【发布时间】:2011-03-11 03:40:28 【问题描述】:我想用 Erlang 写一个主从应用程序。我正在考虑架构中需要的以下内容:
master 死掉时 slave 不应该死掉,而是在 master 宕机时尝试重新连接它
如果远程节点没有自动连接或关闭,master 应该自动启动远程节点(可能是OTP 中的主管行为)
是否有面向 OTP 的行为来执行此操作?我知道我可以使用slave:start_link()
启动远程节点,我可以使用erlang:monitor()
监控节点,但我不知道如何将其合并到gen_server
行为中。
【问题讨论】:
函数 erlang:monitor_node/2 和 erlang:monitor_node/3 也可用。 您看到分布式应用程序部分了吗? erlang.org/doc/design_principles/distributed_applications.html 我们需要一些明确的术语。您想将您的应用程序分布在多个 erlang 虚拟机上(即运行多个 node())还是要构建一个容错的进程树?您的问题并不完全清楚。 【参考方案1】:我同意 cmets 关于使用 erlang:monitor_node 和使用分布式应用程序的观点。
您不能只使用从模块来完成此操作,它明确指出“由主节点启动的所有从节点将在主节点终止时自动终止”。
目前也没有 OTP 行为可以做到这一点。监督树是分层的;看起来您正在寻找在应用程序逻辑方面存在层次结构的东西,但产卵是在对等的基础上(或个人基础,取决于您的观点)完成的。
如果您要使用多个 Erlang 虚拟机,那么您应该仔细考虑您运行的数量,因为大量虚拟机可能会由于操作系统交换操作系统进程而导致性能问题。获得最佳性能的经验法则是每个 CPU 内核的操作系统进程不超过一个(即一个 Erlang VM)。
【讨论】:
【参考方案2】:如果您有兴趣研究其他实现,Basho 的 riak_core 框架对去中心化分布式应用程序有很好的了解。
riak_core_node_watcher.erl 里面有大部分有趣的节点观察代码。
搜索一下,你会发现talks and presentations about the framework不少。
【讨论】:
以上是关于启动远程 Erlang 节点的主要内容,如果未能解决你的问题,请参考以下文章
生成后,Tcp Socket 在 erlang 中的远程节点上不起作用,错误,关闭?