2014-11-03 94 views
2

似乎已經普遍接受的良好做法是,節點進程在遇到未處理的異常時應重新啓動。 (例如:see this)Node.js:在子進程中處理未捕獲的異常

然而,約當應用程序由父子進程什麼的,(例如,使用child_process.fork())我們不能只重新啓動子進程在這種情況下,我的問題是:

什麼被認爲是最佳做法中的一個節點過程

+0

爲什麼不能重新啓動子進程?另外,您可能需要對該問題進行重新說明 - 「最佳實踐」通常是「主要基於觀點的」關閉的一面紅旗。 – Scimonster 2014-11-03 09:12:47

+0

@Scimonster - 如果子進程重新啓動AFAIK,父 - >子之間的通信通道將被中斷。 – UpTheCreek 2014-11-03 09:38:28

回答

2

我不認爲這裏有一個通用的答案處理未被捕獲的錯誤 - 這取決於每個過程的目的,他們是你寫的這兩個節點的應用程序並保持等。

如果你說你的應用程序本身由2個進程組成,我認爲它指的是你寫的兩個節點應用程序,那麼我認爲子進程的一個意外的不乾淨退出應該被當作是主進程中未捕獲的異常處理。記錄它,然後退出父進程並讓超級用戶重啓父進程(然後重啓子進程)。

我的答案會有所不同,例如,如果子進程是graphicsmagick來調整圖像大小。然後,子進程崩潰對父進程的穩定性沒有任何特別的影響,可以記錄錯誤但允許父進程繼續運行。

如果子進程只是使用節點核心羣集模塊的一組工作人員中的一員,那麼否,工作人員崩潰不會要求主羣集超級用戶退出並重新啓動。

我認爲絕大多數長時間運行的節點應用程序並不適合您描述的模型,因此我不認爲社區是最佳實踐。常見的情況是:單一流程,帶外部/輔助助手的單一流程以及主/從羣集。

+0

謝謝。我決定走這條路:讓子進程死於未捕獲的異常;具有用於死亡子進程的父監視器,並在這種情況下重啓進程層次結構。幸運的是,未捕獲的異常對我們來說非常罕見。 – UpTheCreek 2014-11-04 05:32:19

1

處理捕獲的異常的最佳做法是the same for a child process as a parent (http://nodejs.org/api/process.html#process_event_uncaughtexception), from the docs:

注意,uncaughtException是異常 處理一種非常原始的機制,可能在將來被移除。

請勿使用它,請改用域名。如果您確實使用它,在每個未處理的異常之後重新啓動您的 應用程序!

未處理的異常意味着你的應用程序 - 並通過擴展 的node.js本身 - 處於不確定的狀態。盲目恢復意味着 任何事情都可能發生。

在升級 系統時,請考慮恢復拉動電源線。十次中有九次沒有任何反應 - 但是第10次,你的系統就會崩潰。

您已收到警告。

如此看來重啓過程將是最好的

+0

良好的反饋@UpTheCreek和祝你好運! – mattr 2014-11-04 05:39:10

+0

編輯軟化語言,我的道歉! – mattr 2014-11-04 14:38:40

+0

呵呵,不用擔心:) – UpTheCreek 2014-11-04 15:06:20