大话游戏服务器演进《一》小荷才露尖尖角
IEG后台服务器多采用异步多进程架构(关于多进程多线程讨论可以参考【1】),提高并发吞吐,同时模块解耦,方便调试和运维。简单来说游戏后台基本都是接入层+逻辑处理层+存储层
接入层是网络接入:管理网络连接和数据包收发,核心指标是高并发。linux系统的网络异步IO处理经历了select到epoll的演进,主流服务器单机现在可以达到十万级网络并发,开源的有C实现的轻量级的libevent,学习成本低上手快性能高。还有大名鼎鼎的C 网络库ACE(没用过),教科书的典范,适合学习不适合工业化,谁用谁知道( 哈..公司很多人评价过)。我司内部当然也不乏大量成熟稳定的网络库,IEG的tconnd这么多年还是相当稳定了,MIG的taf框架里面也有网络库实现(不过是多线程的框架),SNG也有对应的,总之是五花八门,百花齐放。
逻辑处理层:业务相关的逻辑实现,根据不同的游戏类型不同,大部分都会涉及的大概有:注册登录系统,好友社交系统,排行榜系统,背包系统,技能系统,属性系统,邮件系统,聊天系统,公会系统,PVP系统等等。这里针对分区分服的架构,按照个人的理解可以对这些业务系统做个简单分类:有状态的业务系统,无状态的业务系统,单机的业务系统,跨服的业务系统(全区全服的系统不在这次讨论范围)。这里说明一下:无状态的业务系统是指可以双机热备运行,没有需要保存的状态变量,比如技能系统,玩家无论登录到那台机器都可以升级技能,更新技能数据写入数据库。有状态的业务比如排行榜系统就是有状态的,状态变量就是全服的排行榜,如果设计系统的时候没有把状态变量独立出来,那么这个子系统就不支持双机热备。单机的业务系统是不需要跨服数据交互的,大部分系统都是这个分类。跨服的系统会比较复杂一些,一般重度点游戏都会有公会系统和PVP系统,这些系统都是需要服务器之间通信的,这样使得各个小区变成一个世界系统,可以加强玩家之间的交互,提高活跃度。后续文章会基于分区架构不同对业务系统做一个详细分析。
存储层:存储层是整个业务系统的基石,一般都是采用数据库来落地数据。就像时下牛市很多人炒股投资,最后赚了钱要落地为安放到房子里面去。业务系统对玩家的各种数值的修改,可以放在内存或者缓存,但是最后还是要写入数据库。后台系统使用的数据库主要是SQL关系型数据库和NOSQL数据库【2】。早期的游戏系统都采用的Mysql数据库,但是随着游戏用户规模的不断扩大,业务特性的变化,记录条数较多,记录长度较长,数据访问的压力较大,有较多的读写请求次数。传统关系数据库满足不了业务性能,现在普遍使用key-value的NOSQL数据库。TEG的CMEM和IEG的tcaplus都是nosql行的数据库,比较适合业务使用。不过nosql数据也不是万能的,因为原理无非是内存映射文件或者内存映射索引,所以当热点数据增多超过内存限制时,性能急剧下降,内存数据安全性也会差很多。
图1 游戏服务器三段式