非常教程

Erlang 20参考手册

核心 | kernel

global_group

模块

global_group

模块摘要

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

描述

该模块可以将系统的节点划分为全局组。每个全局组都有自己的全局名称空间,请参阅global(3)

将系统划分为全局组的主要优点是背景负载减少,而在操作全局注册名称时,要更新的节点数量减少。

内核配置参数global_groups定义了全局组(参见kernel(6)config(4)):

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

要使用全局组功能顺利运行进程和节点,必须满足以下条件:

  • 全局组服务器的实例global_group必须在每个节点上运行。当一个节点启动时,这些进程会自动启动并同步。
  • 所有涉及的节点必须同意全局组定义,否则系统的行为是不确定的。
  • 系统中的所有节点必须属于一个全局组。在以下描述中,组节点是属于与本地节点相同的全局组的节点。数据类型group_tuple()=

     {GroupName :: group_name(),[node()]} |

     {GroupName :: group_name(),

      PublishType :: publish_type(),

      [node()]}不带PublishType的GroupTuple与PublishType等同于normal的GroupTuple。 group_name()= atom()publish_type()= hidden | normal

以命令行标志-hidden(参见erl(1))开始的节点被认为是隐藏节点。隐藏节点建立到不属于同一个全局组的节点的隐藏连接,但建立到同一全局组的节点部分的正常(可见)连接。用PublishType定义为隐藏的全局组被称为隐藏全局组。隐藏全局组中的所有节点都是隐藏节点,无论它们是否以命令行标志启动 - 隐藏或不启动。 name()= atom()一个注册名称。 where()= {node,node()} | {group,group_name()} Exportsglobal_groups() - > {GroupName,GroupNames} | undefinedTypes返回包含本地节点所属全局组名称的元组,以及所有其他已知组名称的列表。如果没有定义全局组,则返回undefined .info() - > info_item()返回包含有关全局组信息的列表。

每个列表元素都是一个元组。元组的顺序是未定义的。 {state,State}如果本地节点是全局组的一部分,则State等于同步。如果没有定义全局组,则State等于no_conf。 {own_group_name,GroupName}本地节点所属组的名称(atom)。

{own_group_nodes,Nodes}节点名称(原子),组节点的列表。

{synced_nodes,Nodes}节点名称列表,当前与本地节点同步的组节点。

{sync_error,Nodes}节点名称列表,本地节点无法同步的组节点。

{no_contact,Nodes}节点名称列表,当前没有连接的组节点。 {other_groups,Groups} Groups是元组列表

{GroupName,Nodes},指定其他全局组的名称和节点。 {monitoring,Pids}一个pid列表,指定已订阅nodeup和nodedown消息的进程.

monitor_nodes(Flag) - > okTypes根据标志,调用进程开始订阅(标志等于true)或停止订阅(标志等于false)到节点状态更改消息。已订阅的进程分别在组节点连接或断开连接时接收消息

{nodeup,Node}和{nodedown,Node} .own_nodes() - > NodesTypes返回所有组节点的名称,无论其当前状态如何.

registered_names(Where) - > NamesTypes返回在指定节点或指定全局

group.send(Name,Msg) - > pid()|中全局注册的所有名称的列表。

{badarg,{Name,Msg}}发送(Where,Name,Msg) - > pid()| {Badarg,{Name,Msg}} TypesSearches for Name,在指定节点或指定的全局组中全局注册,或者(如果不提供参数Where,则不在任何全局组中)。全局组按照它们出现在配置参数global_group的值中的顺序进行搜索。如果找到Name,则将消息Msg发送到相应的pid。该pid也是函数的返回值。如果找不到名称,函数将返回{badarg,{Name,Msg}}。sync() - > ok同步组节点,即组节点上的全局名称服务器。还检查当前全局组中全局注册的名称,并在任何已知节点(而非组的一部分)上取消注册。如果无法同步,则​​会向错误记录器发送错误报告(另请参阅error_logger(3)。

{'invalid global_groups definition',Bad}}如果配置参数global_groups的值为无效值,则全局注册为Bad.whereis_name(Name) - > pid()| undefinedwhereis_name(Where,Name) - > pid()| undefinedTypesSearches指定的节点或指定的全局组中,或者(如果参数Where未提供)全局组将按照它们出现在配置参数global_group的值中的顺序进行搜索。如果找到Name,则相应的返回pid,如果找不到名字,函数返回undefined.Notes

  • 在某个节点与其全局组中的其他节点失去连接但与其他全局组中的节点有连接的情况下,来自另一个全局组的请求可能会产生错误或误导性结果。例如,孤立节点可能在其全局组中包含有关注册名称的不准确信息。
  • 功能send/2,3不安全。
  • 应用程序的分布高度依赖于全局组定义。不建议将应用程序分发到多个全局组上,因为注册的名称可以在故障转移/接管时移动到另一个全局组。没有什么可以阻止这种情况,但是应用程序代码必须处理这种情况。

扩展内容

global(3)erl(1)

Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1