网络中断会触发monitor_node或Erlang / Elixir中的链接断开吗?

时间:2018-11-18 22:32:26

标签: erlang elixir otp

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

1)因为我们仍然将C作为中间连接节点,所以A和B之间的中断会触发A和B上的进程之间的链接断开(spawn_link)。那么monitor_node(会在A或B上触发)呢?

2)由于C作为中间连接节点,我们是否仍可以从A进程向B进程发送消息?

3)Erlang / Elixir的成员资格组件如何解决这种情况?会恢复连接并且毕竟没有发生任何不好的事情(没有链接断开,没有monitor_node消息返回,就像立即恢复所有内容一样)吗?

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

2 个答案:

答案 0 :(得分:2)

  

1)因为我们仍然将C作为中间连接节点,所以A和B之间的中断会触发A和B上的进程之间的链接断开(spawn_link)。那么monitor_node(将在A或B上触发)呢?

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

  

2)我们是否仍然可以将消息从A进程发送到B进程,因为   C充当中间连接节点?

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

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

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

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

因此,即使节点C正在运行,A也不会通过它到达B。但是,如果经过C是A到达B的唯一物理方式,那么A和B将不再能够通信

  

3)Erlang / Elixir的成员资格组件如何解决此问题   情况?连接是否会恢复并且真的没什么不好   毕竟发生(没有链接断开,没有返回monitor_node消息)   就像一切都会立即恢复)?

如果受监视的节点发生故障,将向监视过程发送{nodedown, Node}形式的消息,以便它可以处理故障。除非节点本身恢复,否则连接将无法恢复。例如,如果发生故障的节点在网络中没有扮演关键角色,并且其他节点仍可以相互通信,那么您可以说没有什么不好的事情

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

希望这会有所帮助:)

答案 1 :(得分:1)

  

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

     

2)我们还能从A进程向B进程发送消息吗?   因为C充当中间连接节点?

Erlang有一个名为epmd(Erlang Port Mapper Daemon)的服务,它将把节点的信息(ip,名称)广播到其他节点,这些节点将保存它们。 这意味着,每个节点都有关于其他节点的信息映射。 因此,如果网络中断可以恢复并且节点没有死亡(重新启动),则节点可以像以前一样进行通信。 以上情况可以。现在说说无法沟通的情况,epmd(Erlang Port Mapper Daemon)失败了。这时,旧节点会互相保存信息,以便彼此调用。重新启动epmd后,现在创建的新节点无法调用旧节点,因为旧节点不会扩展其信息。

  

3)Erlang / Elixir的成员资格组件如何解决此问题   情况?连接是否会恢复并且真的没什么不好   毕竟发生(没有链接断开,没有返回monitor_node消息)   就像一切都会立即恢复)?

如果

monitor_node与它的连接丢失,则会收到一条消息{nodedown, Node}spawn_link仅链接两个进程,并且只能接收process down msg