查看源代码 global_group (内核 v10.2)
将节点分组到全局名称注册组。
此模块使可以将系统的节点划分为全局组。每个全局组都有其自己的全局命名空间,请参阅 global
。
将系统划分为全局组的主要优点是,当操作全局注册的名称时,后台负载会减少,同时需要更新的节点数量也会减少。
内核配置参数 global_groups
定义了全局组
{global_groups, [GroupTuple :: group_tuple()]}
为了使进程和节点能够顺利使用全局组功能,必须满足以下条件
- 全局组服务器
global_group
的实例必须在每个节点上运行。当节点启动时,进程会自动启动并同步。 - 所有相关节点必须就全局组定义达成一致,否则系统的行为是未定义的。
- 系统中所有节点必须恰好属于一个全局组。
在以下描述中,组节点是指与本地节点属于同一全局组的节点。
注意
- 在节点丢失了与其全局组中其他节点的连接,但与其他全局组中的节点有连接的情况下,来自其他全局组的请求可能会产生不正确或误导性的结果。例如,隔离的节点可能具有其全局组中注册名称的不准确信息。
- 函数
send/2,3
不安全。 - 应用程序的分布高度依赖于全局组定义。不建议将应用程序分布在多个全局组中,因为在故障转移/接管时,注册的名称可能会被移动到另一个全局组。这并没有什么限制,但是应用程序代码必须处理这种情况。
另请参阅
摘要
类型
没有 PublishType
的 GroupTuple
与 PublishType
等于 normal
的 GroupTuple
相同。
已注册的名称。
使用命令行标志 -hidden
启动的节点(请参阅 erl
)被称为隐藏节点。隐藏节点与不属于同一全局组的节点建立隐藏连接,但与属于同一全局组的节点建立正常(可见)连接。
函数
返回一个元组,其中包含本地节点所属的全局组的名称,以及所有其他已知组名称的列表。
返回包含有关全局组信息的列表。每个列表元素都是一个元组。元组的顺序是未定义的。
更改调用进程对节点状态更改消息的订阅。
返回所有组节点的名称,无论其当前状态如何。
返回在指定节点上或指定全局组中全局注册的所有名称的列表。
将 Msg
发送到全局注册名称 Name
表示的 pid。
等效于 send(Name, Msg)
,不同之处在于搜索仅限于 Where
指定的节点或全局组。
同步组节点,即组节点上的全局名称服务器。还会检查当前全局组中全局注册的名称,并在任何已知的不属于该组的节点上取消注册它们。
在任何全局组中搜索 Name
。
等效于 whereis_name(Name)
,不同之处在于搜索仅限于 Where
指定的节点或全局组。
类型
-type group_name() :: atom().
-type group_tuple() :: {GroupName :: group_name(), [node()]} | {GroupName :: group_name(), PublishType :: publish_type(), [node()]}.
没有 PublishType
的 GroupTuple
与 PublishType
等于 normal
的 GroupTuple
相同。
-type info_item() :: {state, State :: sync_state()} | {own_group_name, GroupName :: group_name()} | {own_group_nodes, Nodes :: [node()]} | {synched_nodes, Nodes :: [node()]} | {sync_error, Nodes :: [node()]} | {no_contact, Nodes :: [node()]} | {other_groups, Groups :: [group_tuple()]} | {monitoring, Pids :: [pid()]}.
-type name() :: atom().
已注册的名称。
-type publish_type() :: hidden | normal.
使用命令行标志 -hidden
启动的节点(请参阅 erl
)被称为隐藏节点。隐藏节点与不属于同一全局组的节点建立隐藏连接,但与属于同一全局组的节点建立正常(可见)连接。
使用 PublishType
等于 hidden
定义的全局组被称为隐藏全局组。隐藏全局组中的所有节点都是隐藏节点,无论它们是否使用命令行标志 -hidden
启动。
-type sync_state() :: no_conf | synced.
-type where() :: {node, node()} | {group, group_name()}.
函数
-spec global_groups() -> {GroupName, GroupNames} | undefined when GroupName :: group_name(), GroupNames :: [GroupName].
返回一个元组,其中包含本地节点所属的全局组的名称,以及所有其他已知组名称的列表。
如果未定义全局组,则返回 undefined
。
-spec info() -> [info_item()].
返回包含有关全局组信息的列表。每个列表元素都是一个元组。元组的顺序是未定义的。
{state, State}
- 如果本地节点是全局组的一部分,则State
等于synced
。如果未定义全局组,则State
等于no_conf
。{own_group_name, GroupName}
- 本地节点所属组的名称(原子)。{own_group_nodes, Nodes}
- 节点名称(原子)的列表,即组节点。{synced_nodes, Nodes}
- 节点名称的列表,即当前与本地节点同步的组节点。{sync_error, Nodes}
- 节点名称的列表,即本地节点与其同步失败的组节点。{no_contact, Nodes}
- 节点名称的列表,即当前没有连接的组节点。{other_groups, Groups}
-Groups
是元组{GroupName, Nodes}
的列表,指定其他全局组的名称和节点。{monitoring, Pids}
- pid 的列表,指定已订阅nodeup
和nodedown
消息的进程。
-spec monitor_nodes(Flag) -> ok when Flag :: boolean().
更改调用进程对节点状态更改消息的订阅。
如果 Flag
等于 true
,则调用进程开始订阅节点状态更改消息。如果等于 false
,则停止订阅。
已订阅的进程会在组节点连接或断开连接时分别接收消息 {nodeup, Node}
和 {nodedown, Node}
。
-spec own_nodes() -> Nodes when Nodes :: [Node :: node()].
返回所有组节点的名称,无论其当前状态如何。
返回在指定节点上或指定全局组中全局注册的所有名称的列表。
将 Msg
发送到全局注册名称 Name
表示的 pid。
send/2
在任何全局组中搜索 Name
。全局组按照它们在配置参数 global_groups
的值中出现的顺序进行搜索。
如果找到 Name
,则将消息 Msg
发送到相应的 pid。pid 也是函数的返回值。如果未找到该名称,则函数返回 {badarg, {Name, Msg}}
。
-spec send(Where, Name, Msg) -> pid() | {badarg, {Name, Msg}} when Where :: where(), Name :: name(), Msg :: term().
等效于 send(Name, Msg)
,不同之处在于搜索仅限于 Where
指定的节点或全局组。
-spec sync() -> ok.
同步组节点,即组节点上的全局名称服务器。还会检查当前全局组中全局注册的名称,并在任何已知的不属于该组的节点上取消注册它们。
如果无法同步,则会向错误日志记录器发送错误报告(另请参阅 error_logger
)。
如果配置参数 global_groups
的值 Bad
无效,则返回 {error, {'invalid global_groups definition', Bad}}
。
在任何全局组中搜索 Name
。
全局组按照它们在配置参数 global_groups
的值中出现的顺序进行搜索。
如果找到 Name
,则返回相应的 pid。如果未找到该名称,则函数返回 undefined
。
等效于 whereis_name(Name)
,不同之处在于搜索仅限于 Where
指定的节点或全局组。