网络中断是否会触发 monitor_node 或 link broken in Erlang/Elixir?

Will network interruption trigger monitor_node or link broken in Erlang/Elixir?

在分布式情况下,例如不同机器上的 3 个节点 运行,它们在 Erlang/Elixir 中默认连接为 clique。我们称它们为 A、B 和 C(它们通过调用 network:connect 显式连接)。假设A和B之间发生网络中断。

1) A 和 B 之间的中断是否会触发 A 和 B 上进程之间的链接断开 (spawn_link),因为我们仍然有 C 作为中间连接节点。 monitor_node 怎么样(会在 A 或 B 上触发)?

2)既然C作为中间连接节点,我们还能从A进程向B进程发送消息吗?

3) Erlang/Elixir 的成员组件如何解决这种情况?连接是否会恢复并且真的没有什么不好的事情发生(没有链接中断,没有返回 monitor_node 消息就像一切都立即恢复一样)?

感谢您对这个问题的任何考虑!

1) Will the interruption between A and B trigger the linkage broken (spawn_link) between processes on A and B since we still have C as intermediate connected node. What about monitor_node (will that be triggered on A or B)?

2) Could we still send message from process of A to process of B since C works as intermediate connected node?

Erlang 有一个名为 epmd(Erlang Port Mapper Daemon) 的服务,它将节点的信息(ip,名称)广播到其他节点,这些节点将保存它们。 这意味着,每个节点都有一个关于其他节点的信息映射。 所以如果网络中断可以恢复并且节点没有死(重启),节点可以像往常一样通信。 以上情况即可。现在说一下无法通信的情况,也就是epmd(Erlang Port Mapper Daemon)下来。此时老节点相互保存信息,以便相互调用。重新启动后epmd,现在创建的新节点无法调用旧节点,因为旧节点没有扩展信息。

3) How does the membership components of Erlang/Elixir solve this situation? Will the connection be recovered and nothing bad really happens after all (no linkage broken, no monitor_node message returned just like everything are recovered immediately)?

monitor_node 如果与它的连接丢失,将收到消息 {nodedown, Node}spawn_link 只是 link 两个过程,只能接收 process down msg

1) Will the interruption between A and B trigger the linkage broken (spawn_link) between processes on A and B since we still have C as intermediate connected node. What about monitor_node (will that be triggered on A or B)?

Erlang 节点的默认行为是 传递连接 ,这意味着当从节点 A 到 B 调用 connectping 等函数时,如果建立连接,A 也将尝试连接到 B 已知的所有节点,即在节点 B 调用 nodes() 时获得的列表。

2) Could we still send message from process of A to process of B since C works as intermediate connected node?

这取决于,如果 A 能够通过我上面提到的传递行为直接连接到 B,那么它没有任何区别。见下文:

A ----- C ----- B

如果将 A 连接到 C,将 C 连接到 B,这就是您想象的节点之间的链接方式。但实际上它看起来像这样:

A ----- C
\     /
 \   /
   B

所以即使节点 C 是 运行,A 也不会通过它到达 B。但是如果通过 C 是 A 到达 B 的唯一物理途径,那么 A 和 B 不会'不能再交流了

3) How does the membership components of Erlang/Elixir solve this situation? Will the connection be recovered and nothing bad really happens after all (no linkage broken, no monitor_node message returned just like everything are recovered immediately)?

如果被监控的节点出现故障,将会有一个{nodedown, Node}形式的消息发送到监控进程,以便它可以处理故障。除非节点本身恢复,否则连接不会恢复。例如,如果发生故障的节点在网络中没有发挥关键作用,并且其他节点仍然可以相互通信,那么您可以说 没有什么不好的事情发生

但在我看来,这是一种非常鲁莽的查看节点故障的方式,即使据说 Erlang 是容错的,也不应将其视为 容错 即。应该始终处理错误。

希望这对您有所帮助:)