【问题标题】:Short Circuit Erlang Port Mapper Daemon短路 Erlang 端口映射器守护进程
【发布时间】:2013-10-26 19:40:56
【问题描述】:
【问题讨论】:
标签:
erlang
erlang-shell
erlang-driver
【解决方案1】:
身份验证发生在 Erlang VM(beam 或 beam.smp)之间。 epmd 只处理端口注册。简单地将 epmd 短路并不是很容易,其他方法可能更适合您的实际需要。
很遗憾,epmd 不是默认分发协议 (inet_tcp_dist) 或其SSL counterpart 的选项。有两个未记录的选项看起来可以禁用 epmd (-no_epmd) 或提供替代实现 (epmd_module)。但是,分发协议对 epmd 的依赖是hard-coded,并不依赖于这些选项。
所以你可以:
- 在代码服务器级别覆盖
erl_epmd 模块(可能是最肮脏的方法);
- 提供替代分发协议,该协议将复制(或调用)
inet_tcp_dist,但调用 erl_epmd 的部分除外。主要是需要提供自己的setup/5实现。
如果您不希望 shell 节点连接到 epmd 以注册其名称,您还需要覆盖 listen/1。在这种情况下,您可以将-no_epmd 传递到命令行。
或者,您可以连接到 epmd 以注册监听节点,以便使用默认协议创建 shell 连接。
如果 epmd 丢失了对节点的跟踪(例如,它被杀死,不幸的是 epmd 是单点故障),这种方法特别有用。这样做:
- 创建一个到 epmd 的 TCP 连接并发送一个数据包以使用其已知端口和名称注册丢失的节点。保持 TCP 连接打开,否则 epmd 将取消注册节点。
- 使用上一步中使用的名称将新 shell 连接到丢失的节点。
- 然后您可以关闭在 (1) 中建立的连接,并最终通过调用
erl_epmd:register_node/2 将丢失的节点重新注册到 epmd(如果需要,还可以发送精心设计的 tcp_closed 消息)。