當我使用PHP開發和更新生產服務器上的文件時,我只是即時複製文件,似乎所有內容都可以在不中斷服務器的情況下工作。在使用Go時在生產服務器上更新代碼
但是,如果我要更新Go服務器和應用程序上的代碼,並且需要終止服務器,請將src文件複製到服務器,運行go install,然後啓動服務器,這會中斷服務,如果我經常這樣做,那麼對於我的服務用戶來說這會非常糟糕。
如何在Go Go的http服務器上使用Go而不停機時更新文件?
當我使用PHP開發和更新生產服務器上的文件時,我只是即時複製文件,似乎所有內容都可以在不中斷服務器的情況下工作。在使用Go時在生產服務器上更新代碼
但是,如果我要更新Go服務器和應用程序上的代碼,並且需要終止服務器,請將src文件複製到服務器,運行go install,然後啓動服務器,這會中斷服務,如果我經常這樣做,那麼對於我的服務用戶來說這會非常糟糕。
如何在Go Go的http服務器上使用Go而不停機時更新文件?
恩庫將允許您爲您的用戶做優雅重啓無煩惱:https://github.com/facebookgo/grace
然而,在我的經驗,重新啓動進入應用是如此之快,除非你有一個高流量的網站也不會造成任何麻煩。
謝謝,我會用它! – Alex
首先,不要按順序進行。先複製並安裝。然後你可以停止舊的過程並運行新的過程。
如果您運行應用程序的多個實例,那麼您可以執行滾動更新,以便在您退回一臺服務器時,其他服務器仍在服務。一個類似的方法是做blue-green deployments,它的優點是你的活動集羣運行的代碼總是同質的(而在滾動部署期間,你將有一個混合物,直到它們全部滾動),並且你也可以做藍綠色部署,通常只有一個應用程序實例(而滾動需要多個實例)。但是,它要求您在藍綠色開關過程中將實例數加倍。
您需要考慮的一件事是任何正在進行的請求 - 您可能需要確保正在傳送的請求繼續到達舊代碼服務器,直至完成。
您還可以查看平臺即服務解決方案,該解決方案可以爲您自動完成大量此類工作,還有更多。這樣你就不用手動生產服務器和複製文件了。在思考行動時,12 Factor App原則總是一個很好的開始。
PHP是一個interpreted language,這意味着你提供你的代碼的源代碼格式和PHP解釋器將讀取它並執行它(它可能會創建一個更緊湊的二進制形式,以便它不必再次分析源時需要)。
Go是compiled language,它編譯成本機可執行二進制文件;進一步它是靜態鏈接這意味着您的應用程序所涉及的每個代碼和庫在創建可執行文件時被編譯和鏈接。這意味着你不能將新的go模塊「插入」到正在運行的應用程序中。
您必須停止正在運行的應用程序並啓動新版本。但是,您可以最大限度地縮短停機時間:只有當新版本的可執行文件已經創建並準備運行時,才能停止正在運行的應用程序。您可以選擇在遠程機器上編譯它並將二進制文件上傳到服務器,或者上傳源代碼並將其編譯到服務器上,這並不重要。
通過這種方式,您可以將停機時間減少到最多幾秒鐘,您的用戶不會注意到這一點。此外,您不應每隔一小時更新一次,只需一個小時的編碼就無法實現重大更新。您可以每天安排更新(甚至更少),並且您可以在流量較低時安排它們幾個小時。
如果即使幾秒鐘的停機時間對您來說也是不可接受的,那麼您應該尋找可以自動處理這種情況的平臺,而不會出現任何停機時間。例如,查看Google App Engine - Go。
謝謝你的建議! – Alex
在本地進行編譯(如有必要,進行交叉編譯),然後將二進制文件複製到服務器。一個文件。你不需要在你的服務器上編譯它。 – elithrar
這會導致數據損壞,因爲在覆蓋二進制文件的同時覆蓋或寫入用戶的同時進行讀取? – Alex
不要覆蓋。複製到臨時位置,停止服務(如果必須,請優雅地),覆蓋舊的二進制文件並開始替換。有更多優雅的方法來交換它們,但除非你真的無法在幾秒鐘的計劃停機時間內存活,否則它們會涉及更多的複雜性。例如像Einhorn的插座管理器 – elithrar