Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
网络中断是否会触发Erlang/Elixir中的监视器节点或链路断开?_Erlang_Elixir_Otp - Fatal编程技术网

网络中断是否会触发Erlang/Elixir中的监视器节点或链路断开?

网络中断是否会触发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的成员组件如何解决这种情况?连接

在分布情况下,例如,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
有一个名为
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()
列表中。