2009-07-19 36 views
8

Erlang的容錯能力(據我瞭解)包括使用主管進程來關注工作進程,所以如果一個工人死了,主管可以啓動一個新進程。主管進程如何監控進程?同樣可以在JVM上完成嗎?

Erlang如何進行這種監測,特別是在分佈式情況下?如何確定這個過程真的死了?它有心臟跳動嗎?是什麼內置到運行時環境?如果拔下網線會怎麼樣 - 假設其他進程已經死了,如果它不能與它們通信?等等

我在想如何實現Erlang在JVM(比如Java或Scala)中聲稱的相同的容錯性等。但我不確定它是否需要內置在JVM中的支持才能和Erlang一樣。作爲一個比較點,我還沒有遇到Erlang如何做的定義。

回答

5

Erlang OTP監督通常不在不同節點上的進程之間完成。它會工作,但最好的做法是以不同的方式做。

常用的方法是編寫整個應用程序,使其在每臺機器上運行,但應用程序知道它並不孤單。並且應用程序的某些部分具有節點監視器,因此它知道節點下降(這是通過簡單的網絡ping完成的)。這些節點可用於更改負載均衡規則或落入另一個主節點等。

此ping表示在檢測節點故障時存在延遲。檢測一個死的對等節點可能需要幾秒鐘的時間(或者到它的死鏈接)。

如果主管和流程在本地運行,那麼崩潰和發送給主管的信號非常實在。它依賴於異常崩潰傳播到崩潰的鏈接進程的功能,除非它們陷入退出。

+0

謝謝,這很有道理。在機器之間發送消息不同於在本地進程之間發送消息(更大的開銷,更多的原因可能會失敗等)似乎是常見的事情。所以編寫你的應用程序來了解這一點(沒有銀彈讓本地/遠程調用一樣,所以不要嘗試)。 這意味着JVM中的類似模型當然有可能。只監督本地進程/線程/光纖/行動者/任何,並將代碼寫入您的應用程序ping其他節點(以及如果您無法到達某個節點時該怎麼辦)。 – 2009-07-22 13:58:11

0

看起來有人實施了similar strategy in Scala。我的期望是,一位主管將網絡故障視爲一個失敗的子進程,並且Scala進程的文檔似乎承認了這一點。

+0

謝謝 - 這是一個有趣的帖子。我留下了一條消息,試圖解決它是否支持網絡連接。我感覺到(可能不正確),它正在監視JVM中的其他內容,而沒有處理跨進程邊界問題。但是,如果一切正常,那就太棒了! – 2009-07-20 12:54:41

0

我認爲你的意思是由Supervisor處理portmapper。 您可以通過JInterface來使用Erlang portmapper /基礎架構 - 因此您可以避免重新發明輪子 - 如果您仍然需要它,您至少可以獲得那裏描述的所有接口。

+0

謝謝,但我希望只有Java虛擬機(沒有Erlang虛擬機)。保持簡單(政治上)。 – 2009-07-20 12:58:41

-1

Erlang是開源的,這意味着你可以download the source並得到關於Erlang如何做的明確答案。

Erlang如何做這種監測,特別是在分佈式情況下?如何確定這個過程真的死了?它有心臟跳動嗎?是什麼內置到運行時環境?

我相信這是在BEAM運行時完成的。當一個進程死亡時,一個信號被髮送到與之相關的所有進程。有關完整的討論,請參閱Programming Erlang的第9章。

如果拔下網線會怎麼樣 - 假設其他進程已經死亡,如果它無法與它們通信?等等。

在Erlang中,您可以選擇監視一個節點,並接收{node_up, Node}{node_down, Node}消息。如果你不能再與節點通話,我認爲這些也會被髮送。你如何處理它取決於你。