2010-10-16 148 views
5

這可能是一個基本問題,但我該如何有效地將更新部署到當前運行的node.js代碼?部署更新到生產node.js代碼

我從PHP的到來,JavaScript的(客戶端)的背景,我在那裏時,他們需要更新和變化都在加工生產時現場立即提供可以只覆蓋文件。

但在node.js中我要覆蓋現有文件,然後關機和重新啓動應用程序。我應該擔心潛在的停機時間嗎?對我來說,這似乎是比PHP(腳本)方式更危險的方法。除非我有一個服務器羣集,我可以一次取下一臺服務器進行更新。

什麼樣的策略可用於此?

回答

2

對我來說,這幾乎是:

svn up; monit restart node

這個節點服務器作爲與長輪詢客戶彗星服務器,這樣客戶端只需重新連接就像他們通常會。節點服務器的第一件事是從數據庫中獲取當前狀態信息,所以一切都很順利。

我不認爲這真的是比任何做一個svn up更新一堆PHP文件風險較高。如果有任何事情,它會更安全一些。當你更新一個大型的PHP項目時,有一個機會(如果它是一個高流量的網站,基本上有100%的機會),你可以通過網絡服務器獲取請求,而你仍然在更新。這意味着您將在同一請求中運行更新和過期的代碼。至少通過Node方法,您可以更新的所有內容並重新啓動節點服務器並知道您的所有代碼都是最新的。

2

我不會擔心太多的停機時間,你應該能夠保持這麼短的時間,以避免任何人會注意到的機會(殺死進程並在bash腳本中重新啓動它,或者如果你想保留它到幾分之一秒)。

更值得關注的是但是,許多節點應用程序保留了大量的內存,你要去當你重新啓動它失去狀態信息。例如,如果您正在運行聊天應用程序,則可能不記得用戶正在與誰交談,或者他們所在的頻道/房間。處理此問題更多的是設計問題,而且與應用程序有關。

+0

是。這就是爲什麼將會話數據存儲在永久性數據庫而非內存中的原因。 – 2013-10-19 09:11:26

1

某些雲託管提供程序Node.js(如NodeJitsu或Windows Azure)會將磁盤上的兩個站點版本保留在不同的目錄中,並且一旦新版本完全更新,就會將流量從一個版本重定向到新版本部署。

這通常是平臺即服務(PaaS)提供者的內置功能。但是,如果您正在管理服務器,則需要構建一些功能,以便在新服務器完全部署後,流量從一個版本遷移到另一個版本。

這種方法的優點是,則回滾是容易的,因爲以前的版本保持完好網站上。

1

如果你的Node.js應用程式「不能跳過一個節拍」,意思是它是根據傳入的請求的持續轟擊,你只是單純的不能買得起的快速啓動(即使nodemon)的停機時間。我認爲在某些情況下,您只需要無縫地重新啓動node.js應用程序。 要做到這一點,我用nought:https://github.com/superjoe30/naught 爲您的節點零停機部署。js服務器使用內置集羣API