从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则

http://space.itpub.net/17007506/viewspace-616852

上一篇 / 下一篇  2009-10-19 13:54:17 / 个人分类:服务器构架

  【上篇:从腾讯QQ升级游戏之“快速加入游戏”功能的实现缺陷看C/S之间如何正确分配相关协作】

    腾讯QQGame游戏同时在线的玩家数量极其庞大,为了方便组织玩家组队游戏,腾讯设置了大量游戏室(房间),玩家可以选择进入属意的房间,并在此房间内找到可以加入的游戏组(牌桌、棋盘等)。玩家选择进入某个房间时,必须确保此房间当前人数未满(通常上限为400),否则进入步骤将会失败。玩家在登入QQGame后,会从 服务器端获取某类游戏下所有房间的当前人数数据,玩家可以据此找到未满的房间以便进入。

    如上篇所述的原因,如果待进入房间的人数接近上限时,玩家的进入请求可能失败,这是因为服务器在收到此进入请求之前可能有若干其他玩家也请求进入这个房间,造成房间人数达到上限。这一问题是无法通过上篇所述调整协作分配的方法来解决的,这是因为:要进入的房间是由玩家来指定的,无法在服务器端完成此项工作,游戏软件必须将服务器端所维护的所有房间人数数据复制到玩家的客户端,并让玩家在界面上看到这些数据,以便进行选择。这样,上篇所述的客户端与服务器端协作分配原则(谁掌握数据,谁干活),还得加上一些限制条件,并让位于另一个所谓"用户驱动客户端行为"原则--如果某个功能的执行是由用户来推动的,则这个功能的实现应当放在客户端(或者至少由客户端来控制整个协作),并且客户端必须持有此功能所依赖相关数据的副本,这个副本应当尽量与服务器端的源保持同步。


  图一"进入房间"失败示意

    注意:点击图片可以放大观看

    QQGame还存在一个明显的不足,就是:玩家如果在游戏一段时间后,离开了某个房间,并且想进入其它房间,这时QQGame并不会刷新所有房间的当前人数,造成玩家据此信息所选的待进入房间往往实际上人数已满,使得进入步骤失败。笔者碰到的最糟情形是重复3、4次以上,才最后成功进入另外某个房间。此缺陷其实质是完全放弃了客户端数据副本与服务器端的源保持同步的原则。

    实际上,QQGame的开发者有非常充分的理由来为此缺陷的存在进行辩护:QQGame同时在线的用户数超过百万甚至千万数量级,如果所有客户端要实时(所谓实时,就玩家的体验容忍度而言,可以定为不超过1秒的延迟)地从服务器端获取更新数据,那么最终只有一个结果--系统彻底崩溃。设想一下每秒千万次请求的吞吐量,以普通服务器每秒上百个请求的处理能力(这个数据是根据服务请求处理过程可能涉及到I/O操作来估值的,纯内存处理的情形可能提高若干数量级),需要成千上万台服务器组成集群方能承受(高可用性挑战);而随着玩家不断地进入或退出游戏房间,相关数据一直在快速变化中,正向来看,假设有一台中心服务器持有这些数据,那么需要让成千上万台服务器与中心保持这些动态数据的实时同步(数据一致性挑战);相对应的,逆向来看,玩家进入房间等请求被分配给不同的服务器来处理,一旦玩家进入房间成功则对应服务器内的相关数据被改变,那么假定中的中心服务器就需要实时汇集所有工作服务器内发生的数据变动(数据完整性挑战)。同时处理上万台服务器的数据同步,这需要什么样的中心服务器呢?即使有这样的超级服务器存在,那么Internet网较大的(而且不稳定的)网络通讯延迟又怎么解决呢?

    对于软件缺陷而言,可以在不同的层面来加以解决--从设计、到需求、甚至是直接在业务层面来解决(例如,08年北京奥运会网上购票系统,为了解决订票请求拥塞而至系统崩溃的缺陷,最后放弃了原先"先到先得"的购票业务流程,改为:用户先向系统发订票申请,系统只是记录下来而不进行处理,而到了空闲时,在后台随机抽选幸运者,为他们一一完成订票业务)。当然解决方案所处的层面越高,可能就越让人不满意。就上述进入房间可能遭遇失败的缺陷而言,最简便的解决方案就是:在需求层面调整系统的操作方式,即增加一个类似上篇所述"自动快速加入游戏"的功能--"自动进入房间"功能。系统在服务器端为玩家找到一个人数较多又未满的房间,并尝试进入(注意,软件需求是由用户的操作目标所驱动的,玩家在此的目标就是尽快加入一个满意的游戏组,因此由系统来替代玩家选择目标房间同样符合相关目标)。而为了方便玩家手工选择要进入的房间,则应当增加一个"刷新当前各房间人数"的功能。另外,还可以调整房间的组织模式,例如以地域为单位来划分房间,像深圳(长城宽带)区房间1、四川(电信)房间3、北美区房间1等,在深圳上网的玩家将被系统引导而优先进入深圳区的房间。

    不管怎样,解决软件缺陷的王道还是在设计层面。要解决上述缺陷,架构设计师就必须同时面对高可用、数据一致性、完整性等方面的严峻挑战。

    在思考相关解决方案时,我们将应用若干与高性能服务器集群架构设计相关的一些重要原则。首先是"分而治之"原则,即将大量客户端发出的服务请求进行适当的划分(例如,所有从深圳长城宽带上网的玩家所发出的服务请求分为一组),分别分配给不同的服务器(例如,将前述服务请求分组分配给放置于深圳数据中心的服务器)来加以处理。对于QQGame千万级的并发服务请求数而言,采用Scale Up向上扩展,即升级单个服务器处理能力的方式基本上不予考虑(没有常规的主机能处理每秒上千万的请求)。唯一可行的,只有Scale Out向外扩展,即利用大量服务器集群做负载均衡的方式,这实质上就是"分而治之"原则的具体应用。


    图二 分而治之"下的QQGame游戏服务集群部署
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值