开发语言
服务器和客户端都使用typescript来开发,并且双端使用同一种语言可以共享逻辑代码。
typescript是javascript的超集,最终会编译成javacsript使用,在大型项目的体验远胜过javascript。
开发框架和引擎
客户端采用laya引擎
服务器采用nodejs
两端通过socket.io来通信,保持长链接。
因为微信小游戏必须是https的连接,用nginx做了反向代理。
服务器拓扑
层级图如下:
TopCenter: 集群中心(唯一)
Center:中心(一台物理机器一个)
Game:游戏服务器(一般一台物理机器可以开多个)
Gate:网关(和客户端通信,一般一个游戏开2个足够)
nginx: 反向代理。
服务器集群
分为三个集群:测试,提审,正式;这三个集群不互通包括数据库。
对应微信小游戏的后台就是体验,提审和正式。
测试服是可以使用GM命令来测试的,并且充值任何都是1块钱(省钱)。
提审和正式则没有。
通过正式集群数据库的版本号的配置,来确定客户端登入哪一个集群。
服务器压力测试
采购腾讯云4核(2.7/3.3GHZ)16GB的服务器,承载5000人
此时cpu大概在50%,内存占25%
每个服务器进入1500人,那么峰值一般在300-500,那么1台机器可以开10台服务器。随着时间过去,人数减少,一台物理服务器可以承载更多。
自动开服
一般在一台云服务器配置10个游戏服务器(game),在数据库配置好这些服务器的开服时间,到了时间才能被客户端检索到,也就自动开了。
客户端选择服务器的逻辑是,有登录就进最近的登录的游戏服,否则就进最新开的服务器。
数据库
TopCenter集群中心用mysql数据库,每日自动备份
Center用levelDB数据库,因为levelDB是文件数据库,只能在每次重启时备份。
服务器维护
正式服维护,就是把提审服的代码同步到所有物理机器。
使用nodejs的pm2作为运维工具,可以做到秒级的重启。
但是游戏内的玩家需要存档,预计要几分钟。
并且Center用levelDB数据库是文件数据库,不能热备,只能重启时备份。
所以一般的服务器更新需要半个小时左右。
客户端版本管理
客户端只有一条主干,并没有使用分支开发。
新开发的功能在数据库屏蔽掉其入口即可,如果放出,只需要解除屏蔽即可。
GM权限
在测试服GM可以使用GM指令。
在正式服的服务器列表,GM可以看到所有服务器,也可以进入未到开放时间的服务器,不受开服时间的限制。
一些特殊的机制
相同的游戏角色,新的会顶掉旧的登录,比如网页微信会顶掉手机微信。
角色离线后,三十分钟会踢出游戏(此时再重连会回到登录)。
ios离开(息屏,切换等)超过10秒,会立即重连服务器。(ios网络断线难以判定,比较粗暴的做法。)
充值付费领取的奖励,必须手动点掉,这次不点下次上线会再次弹出。(防止玩家误判)