在 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的主要内容,如果未能解决你的问题,请参考以下文章