查看源代码 如何为 Erlang 分布实现替代节点发现
本节介绍如何为 Erlang 分布实现替代的节点发现机制。节点发现通常使用 DNS 和 Erlang 端口映射守护进程(EPMD)进行端口注册和查找。
注意
对替代节点发现机制的支持是在 Erlang/OTP 21 中添加的。
简介
要实现您自己的节点发现模块,您必须编写自己的 EPMD 模块。EPMD 模块负责提供另一个节点的位置。分布模块(inet_tcp_dist
/inet_tls_dist
)调用 EPMD 模块以获取另一个节点的 IP 地址和端口。作为 Erlang/OTP 一部分的 EPMD 模块将使用 DNS 解析主机名,并使用 EPMD unix 进程来获取另一个节点的端口。EPMD unix 进程通过连接到另一个节点上的众所周知的端口(端口 4369)来完成此操作。
发现模块
发现模块需要实现与常规 EPMD 模块相同的 API。但是,您可以连接到任何服务以查找其他节点的连接详细信息,而不是与 EPMD 通信。通过在启动 erlang 时设置 -epmd_module 来启用发现模块。发现模块必须实现以下回调
start_link/0 - 启动发现模块所需的任何进程。
names/1 - 返回给定主机注册器持有的节点名称。
register_node/2 - 使用注册器注册给定的节点名称。
port_please/3 - 返回给定节点使用的分布端口。
发现模块可以实现以下回调
address_please/3 - 返回给定节点的地址。如果未实现,将使用
erl_epmd:address_please/3
代替。此回调还可以返回给定节点的端口。在这种情况下,可以省略 port_please/3。
listen_port_please/2 - 返回本地节点应监听的端口。如果未实现,将使用
erl_epmd:listen_port_please/2
代替。