经过火的洗礼,泥巴也会有坚强的体魄。
游戏服务器架构通识
前言
我们将从游戏服务器发展的简单历程出发鸟瞰一下目前大多数的游戏服务器架构
这里尽可能的避免陷入细节的技术问题而是从技术进化的结果状态反推原始问题是什么希望能通过这个过程解释清楚游戏服务器是在解决什么问题痛点到底在哪里
一早期网游服务器
<img src="https://pic4.zhimg.com/50/v2-d0d7eed73b05de796146c3a8c621adcc_hd.jpg" data-rawwidth="1011" data-rawheight="535" class="origin_image zh-lightbox-thumb" width="1011" data-original="https://pic4.zhimg.com/v2-d0d7eed73b05de796146c3a8c621adcc_r.jpg"/>
蛮荒时期的游戏服务器框架我们一笔带过那时的游戏服务器和一个小Web服务没有区别
蛮荒时代的服务器只负责存储玩家账号数据转发场景内其他玩家的行为很多移动使用技能等关键逻辑在服务器上根本没有随意就能用变速齿轮改变游戏速度
从传奇的时代开始游戏服务器就不再是简单的上传存档下载存档访问页面而已游戏服务器内部出现了游戏逻辑既能用于同步每个玩家看到的世界又能让逻辑与客户端分离避免早期的网络游戏那种毫无防范的逻辑体系(对外挂防御能力为0)
这种架构奇怪的地方是处理网络连接数据传输的压力和逻辑处理的压力在同一个服务器上(存储模块可能也在同一个进程)就算逻辑处理压力为0承载人数也高不到哪去
二早期游戏服务器的改进版本
当开发者们有了初步经验以后新作品的开发自然而然的过渡到了如下的形式
<img src="https://pic4.zhimg.com/50/v2-4c91ae5157453352ee6a9e00f8ef834a_hd.jpg" data-rawwidth="1112" data-rawheight="680" class="origin_image zh-lightbox-thumb" width="1112" data-original="https://pic4.zhimg.com/v2-4c91ae5157453352ee6a9e00f8ef834a_r.jpg"/>
游戏逻辑服务依然是在一台服务器上单进程(逻辑处理本身肯定是在一个线程中可以有子线程负责内网通信)但是我们自然的想到存储负载和网络连接负载可以从逻辑服上拆出来
由于连接服务器本身没有时序性很容易做分布式的(其实大部分游戏还是只用一个连接服)存储服务不要求高实时性高峰期存盘间隔可以稍长一些不会对游戏服造成影响
三成熟形态的服务器框架(这节是重点)
1逻辑服务器的负载均摊方法一按照功能划分多个服务器进程
<img src="https://pic2.zhimg.com/50/v2-83d176b88c6ffcf64211a8d34ba9d842_hd.jpg" data-rawwidth="1154" data-rawheight="657" class="origin_image zh-lightbox-thumb" width="1154" data-original="https://pic2.zhimg.com/v2-83d176b88c6ffcf64211a8d34ba9d842_r.jpg"/>
2逻辑服务器的负载均摊方法二按照场景划分多个服务器进程
<img src="https://pic2.zhimg.com/50/v2-3c87d414d04a2ab57c24f6bb78af5d45_hd.jpg" data-rawwidth="1139" data-rawheight="654" class="origin_image zh-lightbox-thumb" width="1139" data-original="https://pic2.zhimg.com/v2-3c87d414d04a2ab57c24f6bb78af5d45_r.jpg"/>
难点在逻辑的设计上要像做手术一样把本来是一体的功能切开并抽象出若干个API来保持联系(服务器之间是TCP连接)
在分解时要找联系相对最薄弱的环节入手比如场景和场景之间分开单独抽出聊天服务组队服务好友服务
无论如何分解最终结果只能是有限个服务而且分解的越细开发难度就越大因为跨服务器逻辑是把简单的同步逻辑变成了异步Callback逻辑而且容易出现时序问题等不易测试的问题
单个场景服务几乎是无法分解的分解单个场景难度巨大以至于出现了BigWorld引擎来专门的解决场景分割问题后面会谈到
这种成熟形态的游戏服务器已经能满足现实中99%的频繁交互类网游需求是大型MMO端游页游的主流形式
对比Web服务器
大致只说一点由于数据库的存在以及HTTP请求的特性Web服务器天生就是并发的也一直在高并发的路上越走越远
<img src="https://pic2.zhimg.com/50/v2-e465c12055355c1170130c7c9602a9d2_hd.jpg" data-rawwidth="1143" data-rawheight="650" class="origin_image zh-lightbox-thumb" width="1143" data-original="https://pic2.zhimg.com/v2-e465c12055355c1170130c7c9602a9d2_r.jpg"/>
附开房间式的网络游戏
开房间式的网络游戏也是游戏的一个重要分支英雄联盟DOTA很多手游例如皇室战争王者荣耀等等
这种游戏房间之间几乎没有交互只有大厅内有交互可以理解为原始形态的游戏服务器的平行扩展
房间式游戏扩展难度较小只是需要根据玩家数量动态扩展游戏房间的数量服务器数量很像网站的架构
这种游戏架构最最适合放在云平台上设计合理的话它可能遇到的问题和大型网站几乎一模一样不需要特别的讨论它们
只是毕竟游戏不都是开房间的玩法
1真正的数据都在内存中数据库性能不那么重要
注很多大型游戏采用了共享内存避免宕机时损失过大
2单CPU性能比CPU数量重要的多
3目前有很多游戏特别是手游使用Redis读写代替内存读写甚至也有用Mongo的
4开新服旧区合服的情况非常适合云平台
先进服务器框架
1BigWorld理念过于超前把并发性做到极致开发友好度弱到极致已废
2Skynet本人强烈推荐谁学谁知道除了必须要用lua语言没有什么缺点
聊聊十万行代码
游戏服务器开发速度受美术资源制作速度客户端开发速度制约近几年我猜测服务器方面并不会有大的技术革新
游戏开发未来的趋势是多元化低门槛化大众化很长一段时间内BigWorld这种大怪兽级别的引擎不会再崛起
分布式框架的崛起时间点无论如何也在VR技术成熟之后了