高性能的网络游戏服务器的设计。。。作者谈了QQGAME SERVER。。。 (转)

时间:2022-06-01 12:37:20
高性能的网络游戏服务器的设计。。。作者谈了QQGAME SERVER。。。 (转) 高性能的网络游戏服务器的设计[转]
2007年10月05日 星期五 18:08
    说起高性能的网络游戏,有2个典范,1个是暴雪的WOW,另外一个要数腾讯的QQGame了,因为对于MMPRPG的体系接触不深,几乎属于文盲,没有太多的发言权,而自己又是搞休闲游戏开发的所以本文就主要谈谈QQGame了。 

    前些天通过朋友得到了QQGame的一个系统分析的文档,看完后很是震惊,彻底被QQ的设计所折服了,到底是千万人在线系统经验的拥有者,牛! 

    通过资料了解到QQGame目前有以下让我欣赏的特性: 

1.单机最高容纳35,000人同时在线,对没有看错是这么多,由于它适用了Linux下高性能的网络处理模型ePoll技术,并且一系列高超的优化技术轻松破万人,当然为了稳定性考虑单机保持了2万人的容量,此时的带宽消耗为近30M; 
2.采用共享内存方式高速完成进程间高速通讯; 
3.服务器的扩充方式不是平面的方式,而是裂变式的扩充方式,形成负载均衡阵列树状结构; 
4.所有的游戏服务器不是直接和数据库联系,而是和数据proxy(qq管叫数据交换机和路由器)进行联系,由此带来的就是游戏用户数据的分布存储,我分析着应该是proxy上记录着这个用户数据所在的实际的dbserver的信息,然后定时的将最新的用户信息写回到db中去,这样就大大缓解了数据库服务器的压力,而且可以非常平滑的将数据分裂开来,数据库服务器也就可以无限的扩充,当然我觉得肯定有个数据库信息索引了用户的id和对应的存储地点的关联关系,这点就类似于google的原理了,所以对于数据库的硬件要求也就不是那么高了,qqgame的一组服务器通常是7台服务器,可以容纳5万人,其中就包含了数据库服务器,这点就不是棋牌游戏所常使用的数据集中存储了; 
5.游戏服务器的网络和逻辑分开,不仅仅是层次上的分开,而是在进程上分开,然后中间通过共享通道进行管理和协调,并且增加了辅助线程,在主线程处理大压力的异步的操作的时候直接交给辅助线程处理,保障了游戏服务器的高效性运转。 
    作为游戏服务器的结构方面(以下只讨论休闲游戏部分,MMORPG服务器不属于讨论范围)的设计已经相对于成熟并且统一,结构方面和3年前我所接触的中游系的那套平台没有太大的差异,无非是服务器群采用星状的结构,以1个中心节点作为核心,然后向四周扩散出一些应用服务器,如负责登陆的LoginServer,负责具体游戏逻辑的GameServer等等,当然最精简的结构是这样的,这样的结构可以满足50万以下同时在线的容量,如果为了满足更大的容量,如QQGAME这样的目前已经有200万以上同时在线的超大容量的应用则需要额外的优化,从这个结构中分离出一些子应用独立开发出一些服务器端来处理,一方面降低偶合度,另外一方面作为高可用性系统为负载均衡提供条件. 

关于负载均衡,作为整个游戏平台的所有服务器.我觉得除了具体的游戏逻辑服务器以外都是可以采用负载均衡,多点分担的方式来处理,惟独逻辑服务器不可以,因为休闲游戏,都是分层次的,不管泡泡堂也好,QQGAME也好这些游戏其实在客户端的表现形式都是分层次的,如QQGAME就是LOBBY-HALL-ROOM这样的结构,LOBBY这层就是游戏广场了,可以看到所有的游戏类别,游戏服务器和具体的游戏大厅,比如:牌类–斗地主–新手场–新手场1 这样的顺序,传统的设计中新手场1就是属于一个独立的游戏逻辑服务器拥有一个独立的IP以及侦听端口,在服务器端通常也是一个独立的进程.一般的游戏服务器允许的连接数通常都是300-600人之间超过的就提示服务器已满了,这样做的原因并不是因为进程的限制因为一个进程完全可以做到同时让3000以上的玩家同时游戏,而是人为设计的考虑,因为在游戏逻辑服务器中有很多需要广播的消息,如游戏玩家的聊天信息,某个房间的开始信息,结束信息,某人进出的信息等,而对于广播来说,给300个人广播和给3000个人广播所消耗的资源是绝对没有可比性的。但是通过从进程上独立来处理这个传统的方式也有个缺陷,比如通过开10个进程来达到3000人和1个进程达到3000人,如果不考虑广播的因素在内的话前者的资源是要高与后者的资源的,并且进程间的通讯也要比进程内的通讯要耗费资源和复杂度方面要高很多,比如说如果要实现一个需求让玩家可以在同一类游戏中可以使用小喇叭类或者跨游戏服务器找人之类的功能的话,同一个进程的优势就显示出来了,为此QQGAME所使用的是Channel(频道)的概念,即一个游戏逻辑服务器的进程可以容纳5000人左右,然后服务器端通过设置分割出很多的Channel如新手1,新手2,新手3之类的传统意义上的游戏大厅,将消息的分发范围进行隔离,节约了资源。这一点可以通过查看连接属性看到,连接QQGAME的同类型靠近的几个游戏大厅其实端口和IP都是一致的。 

我们目前的游戏服务器类型主要有3类:CenterServer,管理着所有的服务器连接,LoginServer 负责处理用户的登陆、注册,并且用来给用户传递游戏逻辑服务器列表等功能, GameServer具体逻辑服务器,根据不同的逻辑来实现不同的游戏需求。 

当然,根据业务的发展需要,我们正准备把用户的状态在服务器端保存,并且增加一个类似IM服务器的功能来满足玩家跨服务器聊天和查询其他玩家状态的需要。以及GM服务器实现多功能的网管室的需求,这些将在以后慢慢写。 

今天开始写些技术的题材,一方面记录一些自己的本分工作的东西,另外一方面也是充实一下BLOG,工作太忙也没有什么太多的思绪来一直写其他的题材,所以就拿工作来填充了.同时如果有人有幸看到了这些文章,并且也有兴趣的话也希望多多探讨. 

先简单介绍一下,由于本人的工作就是游戏开发公司的,一直与游戏开发打交道,主要做休闲类的游戏,目前又以棋牌游戏为主,在这个行业中摸爬滚打了整3年了,从运营开始做起,运营过当时国内一流的游戏平台中游系列的产品,然后由于合作方面的原因又自主开发过一套游戏平台,然后由于发展方向上的分歧出来单独做,目前在开发并运维一套全新的产品. 

这篇主要是对于游戏服务器的一些想法,结合目前自身的产品的一些问题延伸开来的. 

目前我们的服务器还是属于Windows平台的架构,暂时还没有考虑到跨平台,主要原因有2:
1.成本:作为公司来说首先得考虑的就是成本了,虽然说Linux类的平台存在着操作系统成本低廉,性能优异,稳定性高这几个特色,但是作为全局考虑来说,一个Linux的系统管理员,以及开发人员的成本要比Windows平台要高很多,并且作为操作系统方面是免费的,但是支持几乎是没有的只有一些不适合商业应用的开源社区作为支撑,要得到更加好的服务或者额外的支持还是得通过大厂商的高额的产品或服务来实现,而Windows平台则不同,虽然操作系统貌似价格不扉,但是本身就带了很多的模块,比如组件服务,日志服务等等,加上平台上各种软件的数量也和Linux下的不是同一量级的,可选择性要大的多,而让Linuxer所诟病的Win32的安全性其实完全可以通过另外独立的安全模块,如硬件防火墙等来完善,毕竟操作系统不是专门做安全防护的Linux也存在很多的漏洞,并且随着Linux发行版的日益增多,用户的逐渐了解,漏洞也日益的增多.
2.开发效率.无疑Visual Studio系列开发套件是目前开发领域最方便最强大的IDE环境,这已是不争的事实,而如果用VI + GCC的模式去开发LINUX下面的服务器其效率和质量至少从我目前的水平(可以部分代表国内目前中小游戏软件开发商实际现状)要彻底的领悟并转换需要一定的时间,并且还没有成熟的开发平台作为保证, JAVA好象有 但是C++还没有听说有超过VC++的.