[英]How to achieve zero downtime redeployment in Node.js
實現Node.js應用程序零停機的最簡單方法是什么?
我有一個需要重新部署以下步驟的應用程序:
npm install
node_modules/.bin/bower install
node_modules/.bin/gulp
這些操作的結果是在名為build
的gulpfile.js
目錄生成的隨時可以運行的應用程序。 在這個目錄中我也有同樣的應用程序的當前運行的實例(目前通過推出永遠這樣的- forever start server.js
)。
據我所知,不可能通過forever
模塊實現零停機時間,因此我決定選擇另一種方式來實現。
我看到了pm2,但是我發現它非常復雜(如果您感覺不一樣,請向我證明錯誤)。
我也看到一無所獲,但我什至無法通過naught start server.js
啟動我的應用程序-它甚至無法在stdout / stderr中打印任何內容。
我也看到了正常運行時間,但是我不知道這個想法-當我運行gulp
應該替換當前正在運行的實例當前工作的目錄中的文件時,它將如何處理情況?
關於在構建過程中處理替換文件:如果這些文件由Node.js應用程序使用,則所有更改將在進程重新啟動時應用(因為這些文件已加載到內存中),瀏覽器前端文件也可以緩存在應用程序內存中以實現類似的目的行為(僅在重新啟動或/和緩存失效后才應用更改)。
我們在群集模式下使用pm2。
pm2 start app.js -i
上面的命令在所有可用CPU內核上以集群模式啟動app.js
零停機重啟:
pm2 gracefulReload all
此命令將按順序重新啟動所有進程,因此,如果啟動並運行了多個進程,則始終有至少一個服務器在重新啟動期間請求該進程。 如果只有一個進程app.js
,則可以在集群模式下啟動它,然后運行pm2 scale app.js 2
(再啟動一個進程),然后運行pm2 gracefulReload all
,然后再運行pm2 scale app.js 1
(刪除先前啟動的進程)。
盡管我認為重新啟動應用程序不是零停機時間部署的主要問題,但我們尚未設法處理數據庫遷移,因此需要完全關閉應用程序才能應用數據庫更改。 當在部署期間用戶獲得新版本的瀏覽器前端文件時,瀏覽器前端文件也可能存在問題,但是AJAX請求由服務器進程的舊版本處理,在這種情況下,粘性會話和API版本得以解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.