Erlang 支持使用global_group模块将其节点划分为组。此外,Erlang 支持动态添加节点到节点网络。这两个功能可以互相使用吗?
据我了解,您必须在启动时命名每个节点才能使用全局组。
2 回答
节点是一个正在执行的 Erlang 运行时系统,它使用命令行标志 -name(长名称)或 -sname(短名称)来命名。
隐藏节点是以命令行标志 -hidden 开头的节点。隐藏节点和其他节点之间的连接是不可传递的,它们必须明确设置。此外,隐藏节点不会出现在 nodes() 返回的节点列表中。相反,必须使用节点(隐藏)或节点(连接)。这意味着,例如,隐藏节点不会被添加到 global 正在跟踪的节点集合中。
所以简而言之,是的,您需要给我们的节点一个名称,以便其他节点能够找到它。
感觉您要么在没有尝试的情况下提出问题,要么有一个非常复杂的问题,也许您尝试完成的示例可以提供更好的答案。
查看global_group source,节点列表是节点在同步时检查的配置的一部分。
然而,有一个导出的函数global_group:global_groups_changed可以处理节点列表的变化。
这是从kernel:config_change 调用的(参见Module:config_change/3),因此在发布升级期间当然可以将新节点添加到 global_group (OTP 嵌入式系统样式)(参见“更新应用程序规范”)
可以简单地做:
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 源中有关在版本升级期间同步的评论)
但是一旦对他们所有人都这样做了,
global_group:sync()
应该让一切恢复正常。
我还没有测试过上面的食谱,但对我来说它看起来很好吃。^_^