簡體   English   中英

網絡中斷會觸發monitor_node或Erlang / Elixir中的鏈接斷開嗎?

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

在分發情況下,例如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消息返回,就像立即恢復所有內容一樣)?

感謝您對此問題的任何考慮!

1)由於我們仍然將C作為中間連接節點,因此A和B之間的中斷是否會觸發A和B上的進程之間的鏈接斷開(spawn_link)。 那么monitor_node(會在A或B上觸發)呢?

Erlang節點的默認行為是傳遞地連接,這意味着當功能,如connectping從節點A叫B,如果連接建立一個也將嘗試撥打電話時連接到用B即獲得列出已知的所有節點節點B上的nodes()

2)由於C作為中間連接節點,我們是否仍可以從A進程向B進程發送消息?

這取決於,如果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具有容錯能力,也不應將其視為錯誤處理,即應該始終處理錯誤。

希望這可以幫助 :)

1)因為我們仍然將C作為中間連接節點,所以A和B之間的中斷會觸發A和B上的進程之間的鏈接斷開(spawn_link)。 那么monitor_node(會在A或B上觸發)呢?

2)由於C作為中間連接節點,我們是否仍可以從A進程向B進程發送消息?

Erlang有一個名為epmd(Erlang Port Mapper Daemon) ,該服務會將節點的信息(ip,名稱)廣播到其他節點,這些節點將保存它們。 這意味着,每個節點都有關於其他節點的信息映射。 因此,如果網絡中斷可以恢復並且節點沒有死亡(重新啟動),則節點可以像以前一樣進行通信。 以上情況可以。 現在說說無法溝通的情況,這是epmd(Erlang Port Mapper Daemon)宕機的原因。 這時,舊節點會互相保存信息,以便彼此調用。 重新啟動epmd ,現在創建的新節點無法調用舊節點,因為舊節點不會epmd其信息。

3)Erlang / Elixir的成員資格組件如何解決這種情況? 是否將恢復連接並且畢竟沒有發生任何不好的事情(沒有鏈接斷開,沒有Monitor_node消息返回,就像立即恢復所有內容一樣)?

如果與該{nodedown, Node}的連接斷開,則monitor_node將收到一條消息{nodedown, Node} spawn_link只是鏈接兩個進程,只能接收msg下的進程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM