|
|
作者:tarkey
??所谓网络游戏,就是大家一起玩,相互都看得见的。这点在老外的网络游戏中体现得很好,一组服务器,几乎全北美的玩家都可以在上面进行互动,大家相互都看得见。而在国内,几乎是任何服务器都要先选区域,为什么?就因为游戏本身就并不是量身为中国玩家设计,容纳不了太多的人。
容纳1000人和100万人的结构上的区别是显而易见的,那么如何来设计符合中国国情的服务器结构体系?或者说能容纳100万人在同一世界的结构?当然,100万人在同一屏幕是不可能的,那么我们来分析一下瓶颈在什么地方。服务器的瓶颈基本上都可以通过分布式来解决,那么首先来分析一下客户机的瓶颈在什么地方。
1)图形,屏幕上能看到的实体太多
2)网络,主要是带宽限制
我们先来看网络,因为这是硬伤,无论如何都无法解决的,而图形可以通过和美术配合等多方面的因素来做到某种程度上的妥协。对于网络带宽来说,现在大部分玩家上网用的是两种宽带,一种是CABLE,一种是ADSL,另外也有网吧租DDN的,其中的瓶颈在ADSL,一般速度在50k-60k,当然,有些网吧用廉价的网络方案的话,可能速度瓶颈会限制在20-30k左右,那么20-30k表示什么意义呢。
首先,假设游戏的逻辑数据包未压缩之前的大小在32 bytes左右,实际证明,90%的逻辑都可以在32bytes这个大小完成,聊天信息除外。那么假设25k的带宽限制的话,就表示每秒可以接收800个消息包,平均每个用户每秒发4个逻辑包,那么就表示用户周围可以看到的其他玩家不能超过400个,这个数字其实已经很满意了。完全可以通过把地图切分消息广播的区域来保证每个玩家看到的用户不会超过400个这么一个概念。或者换句话说,客户机基本上不存在任何真正的硬伤瓶颈。
那么下面来看看服务器的分布,要如何分布才能满足100万人同时在线并且仍然能运转自如,首先对于每秒每个玩家4条消息这样的频率来说,用任何IO方案,都只能保持每台服务器500人左右的连接,因为切换频率太快了,并且虽然事实上不止500人,或者说800人,但是500人的时候,服务器的负载已经比较重了,我们还需要服务器处理一些简单的逻辑之类的。所以对于每台服务器500人的高频率活动连接,是比较满意的数据了。
那么是不是这简单的一层网关分布就可以了呢,显然不行的,假设有500个分布节点,那么负责管理这500个分布节点的服务器的负载仍然很重,而且500*500 =250000到顶了也只能支持25用户的消息处理。那么需要再多一层分布,比如我们设立每500个网关为一个区域,每500个区域为一个地域,那么我们需要对至少四个地域进行管理。
下面来看看中心服务器的网络流量情况,对于100万个用户,每个用户平均每秒128个bytes的传输量,100万个用户就是每秒128,000,000byte = 128M的入口信息,很显然,从这种速率的流量中进行捕捉并不是难事,Intel Solution Service一早也就解决了千兆网的网络捕捉方案,用的就是我以前讲过的环型内存。
接下来看看逻辑处理的分布。这里讲的逻辑分布,是指中心服务器里面的服务器硬件分布情况。这里将采用基于区域的分布和基于功能的分布结合起来进行分布的方法。首先根据捕捉出的数据中的消息类型,分布到各个功能不同的模块进行处理,主要是和游戏内容无关的模块,登陆,数据库之类的,而游戏内容逻辑可以按照区域来进行分布。
另外在老外的眼里看来,似乎Lineage(天堂1)是个很吊的游戏,很多ACM论文里面也介绍到Lineage对外宣传它支持4 millions玩家同时在线之类的?另外也有一篇讲它支持20millions的玩家同时在线?居然这些文章都是ACM里面的,我就觉得有些奇怪了,不知道是否Lineage的结构确实做得很吊?
成本?很显然,这种结构的成本相比于基于组结构的服务器集群来讲是一样的,基于组的服务器集群中总是有2/3的机器是用来做IO处理的分布。在此抛砖引玉,希望大家一起来讨论讨论这样的问题。 |
|