游戏服务架构(三) 这里从基础的服务端开始, 主要是服务端选型和要点说明, 在广州这里我见过基本上这几种:
Skyent: 最广泛的的游戏服务端, 基本上采用 Lua 编写业务 Golang/Java: 这种最近兴起相对简单服务端架构, 之前看都是不做热更而让客户端在断线重连做更新( 之前在家公司见过 Java-NIO 感觉有过度设计和启动服务直接带个2G内存占用确实吃不消 ). NodeJs/PHP: 这种 2020 年那时候兴起以 NodeJs(pomelo )/PHP( swoole/workman ) 其实差不多, 业务比较单一都是断线也是直接采用客户端连接. C++/C#无头服务器: 高性能所需的纯 C/C++ 代码编写业务, 目前看的比较多的是 Unity 无头服务让服务端挂载个游戏客户端当作主机监听转发逻辑消息. 我个人感觉 Java-Nio 这套调试最容易, 但是性能消耗及其严重 (在单机上配个 16GB 内存的时候, IDE 占用甚至开单个都卡的无比心酸, 更别说加个 Linux 虚拟机 ), 且不带 Lua 做业务编写热更新带来的麻烦导致必须重启服务.
还有我觉得Java最大问题没有像Lua/Js这种业务脚本,在做客户端业务对接没办法做到多端共用, 之前最完美的方案是客户端主程编写好 Lua 逻辑之后可以达到服务端共用地步( 有时候客户端和策划做主要对接的时候, 需要沟通策划先出大概玩法逻辑其中会直接Lua做功能演示, 后续服务端和客户端对下功能直接用就行了 )
在我个人开来, 游戏服务端基本上可以直接集中于 Linux 端上( 基本上最后平台也只会在Linux平台 ), 无须为跨平台考虑. 而且最好比较有支持寄宿脚本语言做业务开发( Lua/Js 都行 ), 无法支持脚本业务热更新的方案在我个人看来是不合格的.
这里说下 常规语言热更新 和 游戏热更新 是两种完全不一样的概念, 常规语言热更新是监听 Linux 信号量之后做二进制覆盖启动重载, 这种情况下的程序覆盖的时候会造成中断且业务没办法无损切换, 可以思考下 socket 推送给服务端计数器 N+1 函数怎么无损不修改切换成 N+2, 并且追加 logger 打印展示( 这种情况很常见, 有些时候需要现在数据本身有问题需要动态热更新追加打印 ).