開服湧入的問題

之前我們向運營要求更多的導入,運營說每每開服導入流量,我們的留存並不高,拒絕更多流量導入。

剛剛完成的壓力測試,我發現大量用戶在集中時間內湧入服務器,創角進入遊戲佔用了90%的cpu時間,服務器基本沒有cpu資源響應其他。


這是個很嚴重的問題,第一次的體驗決定了這個玩家的感受,決定了遊戲的留存。

閱讀代碼,創角和進入遊戲的代碼含有不少的同步數據庫操作。怎麼破?


我的想法是,開服前提前創建5000個角色和相應的玩法數據。創建時,系統分配一個角色數據,進入遊戲,服務器僅僅需要一步數據庫操作,更新此角色數據和帳號的關係。


開服,進入遊戲效率低下解決
1思路
    不要讓多個用戶進入遊戲循環這個同步操作,產生競爭條件,延伸就是不使用一個線程一個世界,一個服務區多個線程分多個世界線的概念,使用一個線程幾個場景,一個服務區一個世界。還是那麼多用戶,那是那麼多線程,進入不同場景的用戶進入不同的線程,爭奪互斥資源的機率大大減小。

    不在遊戲循環內加載用戶數據,或者保存用戶數據
    對於進入遊戲不使用進入場景算法。單獨設計,並增強爲進入計算展開,一次計算多個用戶進入(掃描在場用戶針對多個進場用戶)
 

2方案
    0 賬號的狀態設置爲 logining , login , logouting , logout 。
    1 用戶數據庫讀寫分離,假設單獨的用戶數據加載服務器SERVERusrdata。登錄授權完成後,在此加載用戶數據。
    2 SERVERusrdata上用戶數據加載完成後,向客戶端發送信號SINGALusrdata。
    3 客戶端接收信號SINGALusrdata,登錄遊戲服務器SERVERgame。
        檢查賬號的狀態,
            logining ,logouting ,返回SINGALretry 3次後間隔更長時間
            login ,不用拉取數據,切換賬號會話,舊鏈接丟棄即可。
            none , logout ,向SERVERusrdata拉取用戶數據,設置爲 logining

    4 SERVERgame向SERVERusrdata拉取用戶數據(保存在遊戲同步循環外LOOP的內存區),
        成功向客戶端發送SINGALgameok,並安排LOOP內的任務,
        失敗向客戶端發送SINGALgamefailse,

    5 客戶端收到SINGALgameok,do something;收到SINGALgamefailse,重複3,4,5
    6 不同的LOOP執行step4安排的任務
        計算位置和屬性和戰鬥的同步
        同一場景可以一次計算多個進入
        設置狀態爲 login
    7 loop
    8 設置賬號的狀態爲 logouting ,安排LOOP外的任務
    9 保存用戶數據結束,設置賬號的狀態爲 logout

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章