网络中断是否会触发Erlang/Elixir中的监视器节点或链路断开?
在分布情况下,例如,3个节点运行在不同的机器上,它们在Erlang/Elixir中默认作为团连接。我们称它们为A、B和C(它们通过调用network:connect显式连接)。假设A和B之间发生网络中断 1) A和B之间的中断是否会触发A和B上进程之间的链接断开(spawn_link),因为我们仍然将C作为中间连接节点。监视器节点(将在A或B上触发)如何 2) 由于C作为中间连接节点工作,我们是否仍然可以将消息从A进程发送到B进程 3) Erlang/Elixir的成员组件如何解决这种情况?连接是否会被恢复,并且最终不会发生任何不好的事情(没有链接中断,没有监视器节点消息返回,就像一切都会立即恢复一样) 谢谢你对这个问题的考虑 1) A和B之间的中断是否会触发联动装置断开 (spawn_link)在A和B上的进程之间,因为我们仍然使用C作为 中间连接节点。监视器节点(将在A或B上触发)如何 2) 我们还能从A进程向B进程发送消息吗 既然C是中间连接的节点网络中断是否会触发Erlang/Elixir中的监视器节点或链路断开?,erlang,elixir,otp,Erlang,Elixir,Otp,在分布情况下,例如,3个节点运行在不同的机器上,它们在Erlang/Elixir中默认作为团连接。我们称它们为A、B和C(它们通过调用network:connect显式连接)。假设A和B之间发生网络中断 1) A和B之间的中断是否会触发A和B上进程之间的链接断开(spawn_link),因为我们仍然将C作为中间连接节点。监视器节点(将在A或B上触发)如何 2) 由于C作为中间连接节点工作,我们是否仍然可以将消息从A进程发送到B进程 3) Erlang/Elixir的成员组件如何解决这种情况?连接
Erlang
有一个名为epmd(Erlang端口映射程序守护进程)
的服务,该服务将向其他节点广播节点的信息(ip、名称),这些节点将保存这些信息。
这意味着,每个节点都有一个关于其他节点的信息映射。
因此,如果网络中断可以恢复,并且节点没有死机(重新启动),那么节点也可以进行相同的通信。
以上的情况可以。现在谈谈无法通信的情况,即epmd(Erlang端口映射器守护进程)
关闭。此时,旧节点彼此保留信息,以便可以相互调用。重新启动epmd
后,现在创建的新节点无法调用旧节点,因为旧节点不会扩展其信息
3) Erlang/Elixir的成员组件如何解决这个问题
情况如何?连接会恢复吗?真的没什么不好的吗
毕竟发生(没有链接断开,没有监视器节点消息返回
就像一切都会立即恢复一样
如果与监控节点的连接断开,监控节点将收到一条消息{nodedown,node}
。
spawn\u link
只需链接两个进程,只能接收
1) A和B之间的中断是否会触发A和B上进程之间的链接断开(spawn_link),因为我们仍然将C作为中间连接节点。监视器节点(将在A或B上触发)如何
Erlang节点的默认行为是传递连接,这意味着当从节点A到B调用connect
或ping
等函数时,如果建立了连接,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的成员组件如何解决这个问题
情况如何?连接会恢复吗?真的没什么不好的吗
毕竟发生(没有链接断开,没有监视器节点消息返回
就像一切都会立即恢复一样
如果受监视的节点发生故障,将向监视进程发送一条形式为{nodedown,node}
的消息,以便它能够处理故障。除非节点本身恢复,否则不会恢复连接。例如,如果出现故障的节点在网络中不起关键作用,而其他节点仍然可以相互通信,那么您可以说没有什么不好的事情发生
但在我看来,这是一种非常鲁莽的方式来看待节点故障,即使Erlang被认为是容错的,也不应将其视为容错,即人们应该始终处理错误
希望这有帮助:)你所说的“旧节点”和“新节点”是什么意思?所以,即使B仍然是活动的,如果一个监视器\u节点B,它将在连接丢失后接收{nodedown,B}?(注:我们还有C连A连B)@chenyuandong 1。A、 B创建2<代码>epmd
关闭并重新启动3。C、 D创建:A和B是旧节点,C和D是新节点。@陈元东是的。A将收到{nodedown,B}
>如果与监视器的连接丢失,监视器节点将收到消息{nodedown,node}来自文档。那么Erlang中的节点是否只有其定向连接邻居的拓扑知识?因为这是默认的团拓扑,所以如果网络中断,任何节点都会假定邻居停机(无论它是否间接连接)?我认为拓扑中没有方向的概念。默认情况下,每个连接都是双向的。nodes()
函数将返回当前节点连接到的节点列表。如果某个节点由于不再存在指向它的路径而变得无法访问,它将不再出现在nodes()
列表中。