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