[英]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節點的默認行為是傳遞地連接,這意味着當功能,如connect
或ping
從節點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.