2016-03-01 72 views
3

請注意,此問題是而不是關於在進程崩潰時保持進程運行,或者在新部署完成時重新啓動進程。這個問題是關於如何重新啓動而不殺死掛起的操作。優雅地關閉節點實例,無需停止任何操作

我有一個接收命中的很多每秒一非常繁忙的節點應用。我的應用程序運行需要很長時間才返回的函數(請參閱:通過API上傳youtube)。

我遇到的問題是,當我部署應用程序的新版本時,進程會重新啓動 - 因此,任何「掛起」的內容都會基本中止。這意味着10個youtube上傳可能會被殺死,需要重新上傳。 現在:

  • 清空事件隊列基本上是不可能的,因爲我可以等待相當長的一段
  • 查殺過程中被證明是有問題的

理想的解決方案將是以確保任何正在進行的請求都滿足,但用新部署的代碼提供任何新請求。

可能的構思:

  • 有一個主過程,需要連接。這個過程永遠不會改變
  • 當有更新時,將信號發送到這個過程,將刷新「亞軍」
  • 在這一點上,任何新的請求將通過更新亞軍

唯一當你不得不重新啓動進程本身的時候,你需要更新主控人進行連接。

這種方法是「完成」嗎?有沒有一個模塊可以做到這一點?或者這是一個總的矯枉過正?

UPDATE

有趣的答案:https://stackoverflow.com/a/10711410/829771然而,這是不現實的等待事件循環是重新啓動的過程。

但是在這裏還有另一層次的複雜性:如果服務器有定時器,並且例如每5分鐘運行一次任務,那麼按照我上面寫的你最終會以兩個運行。因此,必須通過信號通知「過時」進程必須監聽它,並在收到它時停止任何「後臺」操作。請記住,這不是理論 - 我setInterval() s在我的應用程序

+1

可能的解決方案:您可以嘗試發送/捕獲信號(如SIGTERM)。發送信號時,服務器將停止接受客戶端連接,但會在所有上傳完成後繼續上傳並終止。在發生這種情況時,使用新代碼啓動一個新的nodejs進程,並接受連接。這假設兩個進程可以同時使用您的數據存儲,大多數數據庫都支持。 –

+0

這實際上是一個非常有趣的解決方案。但是......我怎麼能成爲唯一一個問這個問題呢?我真的不明白 – Merc

回答

-2

只要你擔心所有你需要正常關機正在等待下載。操作系統會自動處理其他任何事情,沒有必要「手動」清理所有內部節點的東西。因爲它可能比應用程序本身複雜得多;)

只需在主應用程序的2個不同端口上啓動至少2個「worker」進程,即可實現一些簡單的面板,您可以在其中啓動/暫停它們併發送所有的「任務」給他們中的一個。當你只部署一個,等待上傳完成後,你可以部署,然後移動到第二個。額外的好處是你有一些冗餘。如果你實現一些簡單的「ping」命令,你可以自動路由連接,如果其中一個進程死亡。

你可以實現一些函數,它會返回待定上傳列表中的運行定時器,然後「主」應用程序可以自動殺死跑步者。實際上,如果計時器觸發的操作不是原子操作,則應該在開始時將其添加到列表中,並在結束時將其刪除,即使計時器仍然在滴答滴答,這不是問題。在火災發生之前20秒放在列表中,你不會遇到在獲得「進程」列表,殺死進程和事件觸發之間出現的競爭狀態問題。