請注意,此問題是而不是關於在進程崩潰時保持進程運行,或者在新部署完成時重新啓動進程。這個問題是關於如何重新啓動而不殺死掛起的操作。優雅地關閉節點實例,無需停止任何操作
我有一個接收命中的很多每秒一非常繁忙的節點應用。我的應用程序運行需要很長時間才返回的函數(請參閱:通過API上傳youtube)。
我遇到的問題是,當我部署應用程序的新版本時,進程會重新啓動 - 因此,任何「掛起」的內容都會基本中止。這意味着10個youtube上傳可能會被殺死,需要重新上傳。 現在:
- 清空事件隊列基本上是不可能的,因爲我可以等待相當長的一段
- 查殺過程中被證明是有問題的
理想的解決方案將是以確保任何正在進行的請求都滿足,但用新部署的代碼提供任何新請求。
可能的構思:
- 有一個主過程,需要連接。這個過程永遠不會改變
- 當有更新時,將信號發送到這個過程,將刷新「亞軍」
- 在這一點上,任何新的請求將通過更新亞軍
唯一當你不得不重新啓動進程本身的時候,你需要更新主控人進行連接。
這種方法是「完成」嗎?有沒有一個模塊可以做到這一點?或者這是一個總的矯枉過正?
UPDATE
有趣的答案:https://stackoverflow.com/a/10711410/829771然而,這是不現實的等待事件循環是空重新啓動的過程。
但是在這裏還有另一層次的複雜性:如果服務器有定時器,並且例如每5分鐘運行一次任務,那麼按照我上面寫的你最終會以兩個運行。因此,必須通過信號和通知「過時」進程必須監聽它,並在收到它時停止任何「後臺」操作。請記住,這不是理論 - 我做有setInterval()
s在我的應用程序
可能的解決方案:您可以嘗試發送/捕獲信號(如SIGTERM)。發送信號時,服務器將停止接受客戶端連接,但會在所有上傳完成後繼續上傳並終止。在發生這種情況時,使用新代碼啓動一個新的nodejs進程,並接受連接。這假設兩個進程可以同時使用您的數據存儲,大多數數據庫都支持。 –
這實際上是一個非常有趣的解決方案。但是......我怎麼能成爲唯一一個問這個問題呢?我真的不明白 – Merc