高性能MMORPG通用服务端引擎设计之->基本概念篇二

 

书接上回<高性能MMORPG通用服务端引擎设计之->基本概念篇>

 

上回说道我们将服务器组的职责划分为了,前端服务器,场景服务器,登录服务器,数据服务器...etc.

如图:

Logic-Service   Logic-Service    DB-Service

           |                     |                     |

           -----------------------------------

                                 |

                        Scene Manager

                                 |

               ------------------------------------- 

              |                       |                      |

          Front Server   Front Server     Login Server

              |                      |

             Client             Client        

不过经过思考后发现这个结构有点问题。

问题何在呢?我们来好好分析一下游戏的逻辑后会发现,整个MMORPG的服务端逻辑,其实是对服务端事件的响应,这里有两种事件,一种是对自身属性的改变(比如切换技能,向腰带放入药瓶之类的),一种是改变其他玩家属性,或者是需要通知其他玩家知道的自身属性改变(比如,攻击对方,自己回血,换装,移动等),也就是前文中我们分析发生在场景中的事件,第二种事件远远超过第一种事件,而且大部分的业务逻辑也发生在这些事件中,所以这类事件的处理需要消耗更多的CPU。这样就带来问题了,前端服务器的压力主要在IO,而场景服务器的压力主要在CPU,那么如果分开在不同的机器上部署,那么这两边服务器的压力就不均衡了,前端服务器的CPU剩余很多,场景服务器的CPU又不够用。所以我决定将这两个部分再次合并起来,合成Logic服务,然后多个Logic服务并行运行。

所有的游戏逻辑都在逻辑服务中运算,但是按照MMORPG的业务,所有的逻辑基本都是按照场景来分布的,所以这个时候我门又面临2难的选择题了。第一种方案是,我们可以按照场景来组织逻辑,比如服务器A负责1,3,5,7场景,服务器B负责2,4,6场景,因为场景之间的人数不平均,有的场景人多(比如某某城内,正在被大批人追杀的BOSS所在地),有的场景人少(比如运行一段时间后的新手村),而且游戏中的热点场景是动态变化的,随着游戏进程的发展会有变化。所以这个情况下我们需要一个场景管理服务,这个服务用于监控每个逻辑服务,将热点场景所在的服务里的其他场景迁移到空闲逻辑服务器。这个逻辑需要客户端提供支持,要实现服务器的软切换。还有一种方式是将场景的逻辑随机分布到所有逻辑服务器上,场景间的联系通过消息来传递,由一个消息服务器来为所有场景提供广播组来分发消息。这样就会多个消息服务器出来。这两个方案中第一个对单个玩家来说延迟最小,但是如果场景管理做得不好就会造成CPU资源分布不均匀,还有就是场景容量受到单个进程处理能力极限的局限。第二种方案延迟肯定大过第一种,但是场景的容量不受单个进程计算能力的影响,扩展性更好一点。

 

最后我决定用Python来实现这个想法,一,有丰富的基础框架可以选择,比如用高性能的Gevnet或者Eruasia来作为TCP Server的基础。二是Python本来就是动态的,所以不需要再嵌入另一个动态语言来适应多变的业务逻辑了。其三是Python是动态类型的,在实现消息服务的时候更方便。本来打算用erlang的,不过暂时对OTP还不是很熟悉所以暂时作罢,不过如果采用第二种方式的话我可能会用Erlang来实现消息服务器。

 

下一章直接进入实现阶段,并且无论如何我都会把这个玩意儿弄出来,如果没有公司愿意花钱让我弄,我就业余时间自己弄出来开源,哼哼

 

posted on 2011-01-19 20:10 亚历山大同志 阅读(3304) 评论(14) 编辑 收藏

评论

#1楼 2011-01-19 20:46       

牛人出品,必须要顶!
MMO自认为没有能力搞了,感觉细节方面是在太复杂了,一大堆状态和同步。
 回复 引用 查看   

#2楼 2011-01-19 21:10 烙馅饼喽      

哈哈,楼主赶紧弄出来,然后我来套用一把  回复 引用 查看   

#3楼 2011-01-19 21:42 深山老林      

期待,为国争光。  回复 引用 查看   

#4楼 2011-01-20 09:40 ToBin      

支持,但就是不明白为啥不用c#做服务器端!
难道Python的效率比C#还高!
现在无数人都在观望c#做出来的服务器到底咋样!博主,用c#做吧!
 回复 引用 查看   

#5楼 2011-01-20 10:22 henry      

不知道Python在什么硬件服务上能支持这个网络压力,假设支持3K个用户在线,平均每个用户每秒平均tcp20个包,这样简单算下来秒处理6W个tcp包。  回复 引用 查看   

#6楼[楼主] 2011-01-20 10:35 亚历山大同志      

@henry
其实网游服务器的特点是下行吞吐量比上行吞吐量大,因为客户端的一次请求可能会被广播到好几个用户的客户端(大多数请求都是)。
所以计算网游服务端承载能力的方式和计算Web服务器的不一样,不过Python在现在主流的服务器上承载个几千人在线不是什么大问题

另下行的数据会先行缓存合并请求,所以并不是一有数据就立马下发的,一般是每秒下发一次或者缓冲区满就立即下发一次

这些内容我在下次会详细说明
 回复 引用 查看   

#7楼[楼主] 2011-01-20 10:36 亚历山大同志      

@ToBin
有C#实现的WOW私服服务端啊,语言不是问题,用Node.js的话javascript也能做网游服务端嘛
 回复 引用 查看   

#8楼 2011-01-20 10:41 henry      

@亚历山大同志
我看过WOW的数据包情况就不是,根据场不同而变化,从没什么人的场景十几个TCP包秒,到多人的场接近100个tcp包秒。主要是行为相互变化影响。如果一秒一个包在在互动高的情况根本是不能忍受的。
 回复 引用 查看   

#9楼[楼主] 2011-01-20 11:24 亚历山大同志      

@henry
这个主要还是看业务的需求,如果是要求快速响应的只需要减少超时时间就行了。
在说,处理一个数据包和处理一个Connection的开销是数量级的差别,纯Python实现的Server在处理完整HTTP请求(TCP连接,上行请求,处理,下发数据,关闭)的效率上可以做到每秒3000多个(单进程),8个进程就是2W多个Connection,而一次完整HTTP请求换算成处理数据包可以是多少个呢,假设按照10个来算,那就是20W个咯,当然实际上不是按照乘数的比例来的,再假设处理的内容稍复杂一点,那么同时几千人在线是不困难的。

PS:合并下发最主要的原因是提高网络带宽的利用率,如果对战斗的即时性要求不是这么严格的话(比如很多基于Flash的MMORPG)
 回复 引用 查看   

#10楼 2011-01-20 11:58 henry      

@亚历山大同志
其实排除带宽外,影响性能的不是发送数据有多大,而发送和接收的次数。利用数据整合降低发送数据次数的确是提高性能的好方法(这种只适合互动灵敏度不高的应用)
采用进程分割的方式是一个好方法,一个进程序管理3000个连接每秒接收3000个并发送的确是件非常轻松的事情。
 回复 引用 查看   

#11楼 2011-01-20 13:16 Jun@似水流年      

同志是个有追求的人,支持!  回复 引用 查看   

#12楼[楼主] 2011-01-20 13:27 亚历山大同志      

@henry
其实在抓包观察WOW的时候可能会存在的一个误区是,收发包的数量很大并不能表示延迟就很小了,因为没有联系上下文,有可能你一个包上去,响应很多个包之后才收到。
所以玩WOW还是会感到所谓的“卡”,关于延迟这码事我的想法还是没有经过验证的,我一向强调用数据说话,所以接下来我用一系列的实验来验证我的想法
 回复 引用 查看   

#13楼 2011-01-20 15:28 henry      

@亚历山大同志
数据包多少是和延迟没有关系,每秒数据包多少表示他周围的环境变化多样性。如果周围的几十个角色的行为发生变化都是按一秒的周期给client的话,那这么多角色的行为在这时候统一表现是否协调呢?其实认真的玩下WOW,会发现在跑的过程,做动作对方都能体现到了,如果按秒的周期来放发数据是达不到这级别互动灵敏度的.
 回复 引用 查看   

#14楼[楼主] 2011-01-20 18:24 亚历山大同志      

@henry
一秒是一个超时时间,如果互动很平凡的话,很快就会塞满缓冲区开始下行数据了
 回复 引用 查看   

导航

公告


放一首适合飚车的音乐,听这个开车会不知不觉的加速
昵称:亚历山大同志
园龄:5年1个月
荣誉:推荐博客
粉丝:117
关注:0
<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

搜索

 
 

常用链接

最新随笔

我的标签

随笔分类(128)

随笔档案(134)

相册

朋友的Blog

同事的Blog

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜