不停機更新的原理?
事實上,大多游戲服務器分為邏輯程序服務器和數據庫服務器,如果是線上運營的服務器,基本上是在至少兩臺主機上。
在發現幾個邏輯服務器中的bug,或者加了某些功能,比如少加了三個金幣,多算了一點經驗等,只需要在測試服測試完畢,上傳覆蓋執行文件(jar或php),但是依然要重啟邏輯服務器進程。
而Erlang的熱升級技術,就帶了更好的體驗。Erlang原本脫胎于電信行業,Jow Armstrong 在描述Erlang的設計要求時期中就提到了“軟件維護應該能在不停止系統的情況下進行”。
在實踐中,因為這種不停服務的熱更新獲益良多,終于不用再等到半夜沒人的時候再做更新了,對于一些緊急的bug修復,熱更新實在是一把利器。
Erlang熱更新的秘密其實都集中在wxxxcode-style模塊、wxxxcode-style模塊是Erlang Code Server暴露出來的對外接口,其職責就是把已經編譯好的模塊加載到Erlang的運行時環境。
代碼版本有兩個概念,當前版本代碼“current”和老版本代碼“old”,一旦模塊被加載就變成“current”,再有一個版本過來被加載,之前的版本就變成“old”,新加載的變成“current”。
這時候,兩個版本還是同時存在,新的請求執行的時候會使用新的版本,而老版本的代碼還會被使用因為還有其他模塊的調用“old”版本中。
再進行一次熱更新,這時就有第三個實例被加載,wxxxcode-style server就會終止掉還在駐留在“old”版本代碼依賴的進程。然后第三個實例成為“current”,之前版本的“current”被標記成“old”。
這種方法有效降低了因版本升級而導致的用戶流失。