開發(fā)語言
服務器和客戶端都使用typescript來開發(fā),并且雙端使用同一種語言可以共享邏輯代碼流强。
typescript是javascript的超集汤善,最終會編譯成javacsript使用,在大型項目的體驗遠勝過javascript野宜。
開發(fā)框架和引擎
客戶端采用laya引擎
服務器采用nodejs
兩端通過socket.io來通信太防,保持長鏈接妻顶。
因為微信小游戲必須是https的連接,用nginx做了反向代理杏头。
服務器拓撲
層級圖如下:
TopCenter: 集群中心(唯一)
Center:中心(一臺物理機器一個)
Game:游戲服務器(一般一臺物理機器可以開多個)
Gate:網關(和客戶端通信,一般一個游戲開2個足夠)
nginx: 反向代理盈包。
服務器集群
分為三個集群:測試沸呐,提審醇王,正式;這三個集群不互通包括數(shù)據(jù)庫崭添。
對應微信小游戲的后臺就是體驗寓娩,提審和正式。
測試服是可以使用GM命令來測試的呼渣,并且充值任何都是1塊錢(省錢)棘伴。
提審和正式則沒有。
通過正式集群數(shù)據(jù)庫的版本號的配置屁置,來確定客戶端登入哪一個集群焊夸。
服務器壓力測試
采購騰訊云4核(2.7/3.3GHZ)16GB的服務器,承載5000人
此時cpu大概在50%蓝角,內存占25%
每個服務器進入1500人阱穗,那么峰值一般在300-500,那么1臺機器可以開10臺服務器使鹅。隨著時間過去揪阶,人數(shù)減少,一臺物理服務器可以承載更多患朱。
自動開服
一般在一臺云服務器配置10個游戲服務器(game)鲁僚,在數(shù)據(jù)庫配置好這些服務器的開服時間,到了時間才能被客戶端檢索到裁厅,也就自動開了冰沙。
客戶端選擇服務器的邏輯是,有登錄就進最近的登錄的游戲服执虹,否則就進最新開的服務器拓挥。
數(shù)據(jù)庫
TopCenter集群中心用mysql數(shù)據(jù)庫,每日自動備份
Center用levelDB數(shù)據(jù)庫声畏,因為levelDB是文件數(shù)據(jù)庫撞叽,只能在每次重啟時備份姻成。
服務器維護
正式服維護,就是把提審服的代碼同步到所有物理機器愿棋。
使用nodejs的pm2作為運維工具科展,可以做到秒級的重啟。
但是游戲內的玩家需要存檔糠雨,預計要幾分鐘才睹。
并且Center用levelDB數(shù)據(jù)庫是文件數(shù)據(jù)庫,不能熱備甘邀,只能重啟時備份琅攘。
所以一般的服務器更新需要半個小時左右。
客戶端版本管理
客戶端只有一條主干松邪,并沒有使用分支開發(fā)坞琴。
新開發(fā)的功能在數(shù)據(jù)庫屏蔽掉其入口即可,如果放出逗抑,只需要解除屏蔽即可剧辐。
GM權限
在測試服GM可以使用GM指令。
在正式服的服務器列表邮府,GM可以看到所有服務器荧关,也可以進入未到開放時間的服務器,不受開服時間的限制褂傀。
一些特殊的機制
相同的游戲角色忍啤,新的會頂?shù)襞f的登錄,比如網頁微信會頂?shù)羰謾C微信仙辟。
角色離線后同波,三十分鐘會踢出游戲(此時再重連會回到登錄)。
ios離開(息屏欺嗤,切換等)超過10秒参萄,會立即重連服務器。(ios網絡斷線難以判定煎饼,比較粗暴的做法讹挎。)
充值付費領取的獎勵,必須手動點掉吆玖,這次不點下次上線會再次彈出筒溃。(防止玩家誤判)