目前我正在致力于在 Heroku 上部署服務。該服務輪詢 api 并使用setIntervalNode.js 中的常規方法來執行此操作以獲取新資訊(我無法使用 websocket,因為我不介意使用的 api)。
就像某人開發的任何程式或應用程式一樣,它需要定期更新。我的問題是在 heroku 上更新我的應用程式的最佳方法是什么,以便當我將新更改推送到生產時它不會阻止應用程式運行?原因是我不想錯過來自 api 的新資料。
我的第一個想法是要有某種冗余,其中至少有 2 個服務器運行應用程式,一個更新另一個運行,反之亦然。然而,我不確定這是否是由 heroku 自動完成的,或者如果沒有,我如何確保我設定了這樣的東西,以免在更新程序中遺漏一些資料。甚至從 API 中丟失一條新資料對我們來說都不是一種選擇。
有沒有其他方法可以實作這一點?
uj5u.com熱心網友回復:
在 nodejs 或 Heroku 上沒有零停機更新的自動程序。如果您不能或不希望因更新源檔案而導致停機,然后停止并重新啟動服務器,那么您將不得不做一些事情,就像您已經考慮過使用兩個單獨的行程,其中一個繼續運行而另一個正在運行更新,然后反之亦然。
除了輪詢一些外部 API 之外,您沒有過多說明該應用程式的作用,也沒有說明它如何處理從該 API 獲取的資料。這兩者都與您將如何實作這一點的細節有關。
出于說明的目的,我將對這些未知數做出一些假設。假設此服務應用程式僅使用來自 API 的新發現資料更新資料庫,并且不啟動任何自己的服務器行程。
在這種情況下,您可以設計您的服務,以便您可以運行兩個實體,因此它接受一個命令列引數,以確定它是應該開始輪詢 API 還是應該啟動并等待。你給你的服務器自己的控制埠(通常是一個 http 服務器,它只接受本地請求,而不是來自互聯網的請求),讓你向它發送命令。并且,您可以通過命令列引數或環境變數使控制埠使用的埠可配置,以便您可以啟動應用程式的多個實體,每個實體具有不同的控制埠。
然后是一系列事件:
- 啟動服務器的一個實體并將命令列引數傳遞給它以告訴它立即開始輪詢。
- 它以這種方式運行,直到您準備好更新。
- 然后,當您準備好更新時,您更新不會影響正在運行的實體的本地代碼,因為它的代碼已經加載。
- 更新后,您啟動服務器的第二個實體(運行新代碼)并將命令列引數傳遞給它,告訴它不要開始輪詢。此時,您有兩個正在運行的服務實體,一個(運行舊代碼)正在輪詢 API,另一個(運行新代碼)處于待機狀態。
- 然后,您在每個應用程式的控制埠上發送一個命令。第一個應用程式(運行舊代碼)被告知停止輪詢和關閉。第二個應用程式(運行新代碼)被告知開始輪詢。
- 您現在可以啟動并運行新代碼并輪詢,而不會出現任何中斷。
您可以使用自己喜歡的 shell 腳本自動執行此切換。
如果您的服務器還有一個傳入的 http 服務器來處理來自 Internet 的請求,那么告訴第二個實體開始輪詢的命令也必須在前一個實體關閉后啟動其 http 服務器以處理 Internet 請求。
使用負載平衡器或動態可配置代理,您可以讓兩個 Web 服務器在不同的本地埠上運行,并動態更改負載平衡器/代理配置以在關閉第一個實體之前將所有傳入請求路由到第二個實體,并且不會錯過任何傳入的 Web要求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/363943.html
上一篇:Heroku推送失敗
