查看源代码 global_group (内核 v10.2)

将节点分组到全局名称注册组。

此模块使可以将系统的节点划分为全局组。每个全局组都有其自己的全局命名空间,请参阅 global

将系统划分为全局组的主要优点是,当操作全局注册的名称时,后台负载会减少,同时需要更新的节点数量也会减少。

内核配置参数 global_groups 定义了全局组

{global_groups, [GroupTuple :: group_tuple()]}

为了使进程和节点能够顺利使用全局组功能,必须满足以下条件

  • 全局组服务器 global_group 的实例必须在每个节点上运行。当节点启动时,进程会自动启动并同步。
  • 所有相关节点必须就全局组定义达成一致,否则系统的行为是未定义的。
  • 系统中所有节点必须恰好属于一个全局组。

在以下描述中,组节点是指与本地节点属于同一全局组的节点。

注意

  • 在节点丢失了与其全局组中其他节点的连接,但与其他全局组中的节点有连接的情况下,来自其他全局组的请求可能会产生不正确或误导性的结果。例如,隔离的节点可能具有其全局组中注册名称的不准确信息。
  • 函数 send/2,3 不安全。
  • 应用程序的分布高度依赖于全局组定义。不建议将应用程序分布在多个全局组中,因为在故障转移/接管时,注册的名称可能会被移动到另一个全局组。这并没有什么限制,但是应用程序代码必须处理这种情况。

另请参阅

global, erl

摘要

类型

没有 PublishTypeGroupTuplePublishType 等于 normalGroupTuple 相同。

已注册的名称。

使用命令行标志 -hidden 启动的节点(请参阅 erl)被称为隐藏节点。隐藏节点与不属于同一全局组的节点建立隐藏连接,但与属于同一全局组的节点建立正常(可见)连接。

函数

返回一个元组,其中包含本地节点所属的全局组的名称,以及所有其他已知组名称的列表。

返回包含有关全局组信息的列表。每个列表元素都是一个元组。元组的顺序是未定义的。

更改调用进程对节点状态更改消息的订阅。

返回所有组节点的名称,无论其当前状态如何。

返回在指定节点上或指定全局组中全局注册的所有名称的列表。

Msg 发送到全局注册名称 Name 表示的 pid。

等效于 send(Name, Msg),不同之处在于搜索仅限于 Where 指定的节点或全局组。

同步组节点,即组节点上的全局名称服务器。还会检查当前全局组中全局注册的名称,并在任何已知的不属于该组的节点上取消注册它们。

在任何全局组中搜索 Name

等效于 whereis_name(Name),不同之处在于搜索仅限于 Where 指定的节点或全局组。

类型

链接到此类型

group_name()

查看源代码 (未导出)
-type group_name() :: atom().
链接到此类型

group_tuple()

查看源代码 (未导出)
-type group_tuple() ::
          {GroupName :: group_name(), [node()]} |
          {GroupName :: group_name(), PublishType :: publish_type(), [node()]}.

没有 PublishTypeGroupTuplePublishType 等于 normalGroupTuple 相同。

链接到此类型

info_item()

查看源代码 (未导出)
-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().

已注册的名称。

链接到此类型

publish_type()

查看源代码 (未导出)
-type publish_type() :: hidden | normal.

使用命令行标志 -hidden 启动的节点(请参阅 erl)被称为隐藏节点。隐藏节点与不属于同一全局组的节点建立隐藏连接,但与属于同一全局组的节点建立正常(可见)连接。

使用 PublishType 等于 hidden 定义的全局组被称为隐藏全局组。隐藏全局组中的所有节点都是隐藏节点,无论它们是否使用命令行标志 -hidden 启动。

链接到此类型

sync_state()

查看源代码 (未导出)
-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 的列表,指定已订阅 nodeupnodedown 消息的进程。

-spec monitor_nodes(Flag) -> ok when Flag :: boolean().

更改调用进程对节点状态更改消息的订阅。

如果 Flag 等于 true,则调用进程开始订阅节点状态更改消息。如果等于 false,则停止订阅。

已订阅的进程会在组节点连接或断开连接时分别接收消息 {nodeup, Node}{nodedown, Node}

-spec own_nodes() -> Nodes when Nodes :: [Node :: node()].

返回所有组节点的名称,无论其当前状态如何。

链接到此函数

registered_names(Where)

查看源代码
-spec registered_names(Where) -> Names when Where :: where(), Names :: [Name :: name()].

返回在指定节点上或指定全局组中全局注册的所有名称的列表。

-spec send(Name, Msg) -> pid() | {badarg, {Name, Msg}} when Name :: name(), Msg :: term().

Msg 发送到全局注册名称 Name 表示的 pid。

send/2 在任何全局组中搜索 Name。全局组按照它们在配置参数 global_groups 的值中出现的顺序进行搜索。

如果找到 Name,则将消息 Msg 发送到相应的 pid。pid 也是函数的返回值。如果未找到该名称,则函数返回 {badarg, {Name, Msg}}

链接到此函数

send(Where, 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}}

-spec whereis_name(Name) -> pid() | undefined when Name :: name().

在任何全局组中搜索 Name

全局组按照它们在配置参数 global_groups 的值中出现的顺序进行搜索。

如果找到 Name,则返回相应的 pid。如果未找到该名称,则函数返回 undefined

链接到此函数

whereis_name(Where, Name)

查看源代码
-spec whereis_name(Where, Name) -> pid() | undefined when Where :: where(), Name :: name().

等效于 whereis_name(Name),不同之处在于搜索仅限于 Where 指定的节点或全局组。