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