在 Erlang 中动态添加节点和 global_groups

Posted

技术标签:

【中文标题】在 Erlang 中动态添加节点和 global_groups【英文标题】:Adding nodes dynamically and global_groups in Erlang 【发布时间】:2010-09-17 22:54:04 【问题描述】:

Erlang 支持使用global_group 模块将其节点划分为组。 此外,Erlang 支持动态添加节点到节点网络。这两个功能可以互相使用吗? 据我了解,您必须在启动时命名每个节点才能使用全局组。

【问题讨论】:

【参考方案1】:

节点是一个正在执行的 Erlang 运行时 已命名的系统, 使用命令行标志 -name (长名称)或 -sname(短名称)。

隐藏节点是一个以 命令行标志 -hidden。 隐藏节点之间的连接和 其他节点不具有传递性,它们 必须明确设置。还, 隐藏节点不显示在 节点()返回的节点列表。 相反,节点(隐藏)或 必须使用节点(已连接)。这 意味着,例如,隐藏的 节点不会被添加到集合中 global 正在跟踪的节点。

所以简而言之,是的,你需要给我们的节点一个名字,以便其他节点能够找到它。

感觉你要么没有尝试就问,要么有一个非常复杂的问题,也许你正在尝试完成的一个例子可以提供更好的答案。

【讨论】:

【参考方案2】:

查看global_group source,节点列表是节点在同步时检查的配置的一部分。

但是有一个导出函数global_group:global_groups_changed 可以处理节点列表的变化。

这是从kernel:config_change 调用的(请参阅Module:config_change/3),因此当然可以在版本升级期间将新节点添加到 global_group(OTP 嵌入式系统样式)(请参阅"Updating Application Specifications")

可能可以简单地做到:

application:set_env( kernel, global_groups, [GroupTuple|GroupTuples] ),
kernel:config_change( [  global_groups, [GroupTuple|GroupTuples]  ], [], [] )

假设您已经有一个 global_groups 配置,或者

application:set_env( kernel, global_groups, [GroupTuple|GroupTuples] ),
kernel:config_change( [], [ global_groups, [GroupTuple|GroupTuples] ], [] )

如果您将 global_groups 配置到不存在的集群中。

您需要在每个节点上执行上述操作,如果他们决定在此过程中同步,他们将拆分配置差异的行。 (请参阅global_group source 中关于版本升级期间同步的评论)

但是一旦对他们所有人都这样做了,

global_group:sync()

应该让一切恢复正常。

我没有测试过上面的食谱,但我觉得它很好吃。 ^_^

【讨论】:

以上是关于在 Erlang 中动态添加节点和 global_groups的主要内容,如果未能解决你的问题,请参考以下文章

有大量节点或二进制数据时的 Erlang 消息

Erlang:supervisor(3),添加子进程

向非叶节点动态添加节点不起作用 | J树

ubuntu安装erlang

Erlang epmd官方文档中文翻译

在 Elixir 或 Erlang 中,如何在运行时动态创建和加载模块?