我想在Erlang中编写一个主从应用程序。我考虑以下架构方面的需求:
当主节点宕机时,从节点不应该停止运行,而是在主节点重新上线时尝试重新连接
如果远程节点没有自动连接或者已经宕机,主节点应该自动启动这些节点(可能使用OTP中的supervisor行为)
是否有基于OTP行为可以实现这个功能? 我知道可以使用slave:start_link()
启动远程节点,并可以使用erlang:monitor()
监控节点,但我不知道如何将其整合到gen_server
行为中。
我想在Erlang中编写一个主从应用程序。我考虑以下架构方面的需求:
当主节点宕机时,从节点不应该停止运行,而是在主节点重新上线时尝试重新连接
如果远程节点没有自动连接或者已经宕机,主节点应该自动启动这些节点(可能使用OTP中的supervisor行为)
是否有基于OTP行为可以实现这个功能? 我知道可以使用slave:start_link()
启动远程节点,并可以使用erlang:monitor()
监控节点,但我不知道如何将其整合到gen_server
行为中。
我同意使用erlang:monitor_node和分布式应用程序的评论。
你不能仅仅使用slave模块来完成这个任务,它明确说明“所有由主节点启动的从节点将在主节点终止时自动终止”。
目前还没有OTP行为可以做到这一点。监管树是分层的;看起来你正在寻找一些应用逻辑层次结构的东西,但生成是基于对等或个体的(取决于你的观点)。
如果您要使用多个Erlang VM,则应仔细考虑运行多少个VM,因为大量VM可能会导致性能问题,因为操作系统会交换进程。最佳性能的经验法则是每个CPU核心只有一个操作系统进程(即一个Erlang VM)。
如果你对学习其他实现感兴趣,Basho的riak_core框架对于去中心化分布式应用有很好的理解。
riak_core_node_watcher.erl包含了大部分有趣的节点观察代码。
搜索一下,你会发现有相当多的关于该框架的演讲和展示。