一般情況下,游戲服務(wù)器都會需要處理玩家數(shù)據(jù),所以內(nèi)存里必然保留了一些數(shù)據(jù)的,如果用reload去讓修改的代碼生效,因為會先onWorkerStop,再調(diào)用onWorkerStart,雖然客戶端與gate間的連接并不會斷開,但是處理業(yè)務(wù)的worker被stop并start后,子進程中的內(nèi)存數(shù)據(jù)難道還會存在嗎?
?
如果已經(jīng)不存在了,那這個reload似乎就沒有用了,跟重啟服務(wù)器有何區(qū)別!請大佬解釋下,這是本人最近的困惑!
?
除非你這個reload是僅僅讓修改的代碼生效,但是內(nèi)存中的數(shù)據(jù)都不變!
?
?
1、區(qū)別是:
(1)restart重啟是一次將所有的進程全部退出并重啟,可能會造成服務(wù)暫時不可用。
(2)reload則是安全重啟進程,即原子進程一個一個的退出,然后新子進程一個一個的重啟,可以避免服務(wù)暫時不可用的弊端;另外reload主要用在業(yè)務(wù)代碼有更新的場景下。
2、共同點是:
因為都會經(jīng)歷進程的退出然后重建,所以勢必都會造成進程內(nèi)業(yè)務(wù)數(shù)據(jù)的丟失,可能解決方案是:
將業(yè)務(wù)數(shù)據(jù)持久化到存儲設(shè)備,當(dāng)進程重啟時在onWorkerStart從存儲設(shè)備重載業(yè)務(wù)數(shù)據(jù)。
根據(jù)你的描述,我的猜測應(yīng)該是對的,進程都是有退出和重建。所以只要有業(yè)務(wù)是依賴于內(nèi)存中的數(shù)據(jù),那這種方式必然受到影響,所以restart和reload對我們來說,應(yīng)該沒什么區(qū)別!
?
你說的reload可以避免服務(wù)器的暫時不可用,應(yīng)該是針對新連接到來,至少還能有一個worker能處理業(yè)務(wù)罷了,但是原先處理這個連接的worker如果重啟了,那這個連接中對應(yīng)的內(nèi)存數(shù)據(jù)就沒有了,這個進程如何能在重啟后重新處理這個連接的業(yè)務(wù)呢,顯示是不能了!
?
所以除非把所有內(nèi)存數(shù)據(jù)都搬到內(nèi)存設(shè)備(如redis),否則你這個restart和reload對開發(fā)者而言幾乎沒有區(qū)別!所以平滑重啟也只是一個虛有其表的表象而已,一般的重啟也都是很快的,反正reload也會導(dǎo)致業(yè)務(wù)數(shù)據(jù)需要重新建立,那短暫的服務(wù)器不能提供服務(wù)又如何不能接受呢?!根本 沒啥區(qū)別!
?
謝謝您的回復(fù)!
1、大體如此,對于 reload 或 restart 這種只要是涉及進程重建的指令,原進程內(nèi)存中的數(shù)據(jù)肯定會丟失。
2、另平滑重啟指的是 reload 或 restart 帶 -g 參數(shù)的 gracefully 指令,和普通的重啟可不是一樣的,它會在每個進程的所有請求處理完畢后才會重建進程,當(dāng)然對于條1也是不可避免的。