[原创]龙之谷服务器构架结构设计实现分析[原创]龙之谷服务器构架结构设计实现分析by AKara 2010-07-24 @ http://blog.csdn.net/akara @ akaras(at)163.com --------------------------------------------------------------------- 由于朋友介绍,周末陆续玩了两天 龙之谷(http://dn.sdo.com)。 如果一个网络动作游戏可以打10分,那截止现在,我至少给它9分左右的高分。 无论从手感,动作技能设计,网络流畅度,场景风格,角色塑造,玩法设定, 新手引导,MM亲和度等方面来看,均属上乘之作。 强烈推荐喜欢玩动作类网游的朋友尝试一下。当作3D版的,更好玩的 DNF 吧。 我选了[华南电信二区] -> [3服-烈焰风暴]。角色名 AKara ,欢迎来组。 看来盛大又代理了一个能赚大钱的宠儿。 好的游戏,不妨玩的过程顺便猜测一下它的实现。 --------------------------------------------------------------------- 从7月22日11点到7月24日晚,游戏开了22个大区(电信16个,网通6个,教育网0), 每个大区分为4个独立的数据服分区,玩家数据在这4个服内不能互通。 见 http://dn.sdo.com/web7/home/serverstat.asp 【下面的分析都针对我选的大区来进行】 dnlauncher.exe是选区和patch下载器,选定大区后,其他操作都在主进程。 DragonNest.exe是主进程,由dnlauncher.exe创建。 貌似龙之谷client脚本用Lua? 主进程中的服列表是每次登陆都随机排序,而每个服下的频道列表也是随机 排序。这个随机应该是client对http下载回来的tree内容的client端随机打乱, 这设定一定程度上分流了第一次选服的玩家(但对已有角色的用户来说,不方便); 也分流了每次进服后选频道的玩家(因为各频道共享角色数据,所以是等价的)。 --------------------------------------------------------------------- 先贴一下我初步猜测中的龙之谷的服务器部署结构图: 然后下面是对这个猜测的一些分析过程的数据。 希望同对这方面感兴趣的朋友也提供一些纠正或想法~ --------------------------------------------------------------------- 在 [进程开始->进入channel(的主城)->进入战斗副本->返回主城 ] 这四个游戏中经常经历的阶段中,可以观察到进程中的网络连接的变化: (1) 进程开始 tcp 连接一条,这里先称远端进程为gate。 gate负责账号验证,大区下的服务器组选择,创建新角色,选择角色等功能。 试验多次,发现gate至少存在存在下面的6个。可看到每个服务器部署两个gate。 119.147.185.98:14300 119.147.185.98:14301 119.147.185.85:14300 119.147.185.85:14301 119.147.185.86:14300 119.147.185.86:14301 http连接多条,估计用于下载分服信息的tree。 (2) 进入channel(的主城) 此时client与gate的连接断开。 并建立tcp新连接一条,这里先称远端进程为channel。 经试验,1~9级的普雷利镇被划分为下面20个line(不用channel来命名,避免混淆)来分流: (A) line_1:119.147.185.71:14401 line_2:119.147.185.71:14401 (B) line_3:119.147.185.71:14402 (C) line_4:119.147.185.71:14403 line_5:119.147.185.71:14403 line_6:119.147.185.71:14403 (D) line_7:119.147.185.71:14404 line_8:119.147.185.71:14404 line_9:119.147.185.71:14404 (E) line_10:119.147.185.72:14401 line_11:119.147.185.72:14401 (F) line_12:119.147.185.72:14402 line_13:119.147.185.72:14402 line_14:119.147.185.72:14402 (I) line_15:119.147.185.72:14403 line_16:119.147.185.72:14403 line_17:119.147.185.72:14403 (J) line_18:119.147.185.72:14404 line_19:119.147.185.72:14404 line_20:119.147.185.72:14404 而9~16级的凯德拉关卡现在则只有12个line来服务它: (B) line_1:119.147.185.71:14402 (C) line_2:119.147.185.71:14403 line_3:119.147.185.71:14403 (D) line_4:119.147.185.71:14404 (E) line_5:119.147.185.72:14401 line_6:119.147.185.72:14401 (F) line_7:119.147.185.72:14402 line_8:119.147.185.72:14402 (I) line_9: 119.147.185.72:14403 line_10:119.147.185.72:14403 (J) line_11:119.147.185.72:14404 line_12:119.147.185.72:14404 选择竞技场channel则有12个line: (B) line_2:119.147.185.71:14402 line_2:119.147.185.71:14402 (C) line_3:119.147.185.71:14403 line_4:119.147.185.71:14403 (D) line_5:119.147.185.71:14404 line_6:119.147.185.71:14404 (F) line_7:119.147.185.72:14402 line_8:119.147.185.72:14402 (I) line_9:119.147.185.72:14403 line_10:119.147.185.72:14403 (J) line_11:119.147.185.72:14404 line_12:119.147.185.72:14404 总结一下上面的line和channel信息, 可以大致看出,龙之谷一台服务器上一般部署了4个左右channel进程, 而每个channel进程合并了5~7个左右的line逻辑。 目测估计每个line逻辑承载的人数不应该超过500,就算它300吧。 PS:单进程超过2100人的7分割场景在线(一台服务器就2100*4=8k人)。 由于高级line的人数不满,竞技场的人数不多, 安照上面的配比,就算每个line承载1/2负荷,即150人。 那可以粗略保守估算一下龙之谷现在的最高在线人数: 22大区 * 4小服 * 32个line * 150人/line = 42w 也就是每个大区有约1.9w玩家在线。 (3) 进入战斗副本 此时client与channel的连接断开。 并建立tcp新连接一条,这里先称远端进程为war。 经试验,war并不多: 119.147.185.70:14500 119.147.185.63:14500 119.147.185.64:14500 119.147.185.65:14500 119.147.185.69:14500 如此看来,一个小服内只有5台机器服务它的战斗。 用上面的估算人数来粗略平均一下,就是平均每个war进程负荷1000人的副本战斗。 如果是组队进入战斗副本,则除了原有的TCP的关键消息同步, 还建立了每个玩家和war之间的UDP通讯方式(并非p2p), 应该只用于同步非关键动作和移动。 龙之谷只允许最多4个人的组队。 留意了一下这个UDP信道的通信量: 两次2人组队关卡: 858k/12min(平均1220byte/sec) 877k/10min(平均1496byte/sec) 一次4人组队关卡: 706k/6min(平均2008byte/sec) 而如果是单人进入战斗副本,则完全只和war进程有tcp网络通信: 怪物AI完全是服务器驱动的。 玩一个关卡大概8分钟,因为跑地图花去时间,加上过地图的加载。 下行 100k(平均213byte/sec), 上行90k(平均192byte/sec)。 (4) 返回主城 此时client与war的连接断开。 重新与某个channel建立连接。 这里的"某个"其实就是之前(1)阶段中的那个channel。 有一个假象就是:AKara角色 从 1~9级的普雷利镇 经过副本到底 9~16级的凯德拉关卡 后, 会发现client中的line竟然 从12号 变成了 7号。 但参照上面的channel ip:port便能发现这两line属于同一个channel进程: 普雷利镇 line_12:119.147.185.72:14402 凯德拉关卡 line_7: 119.147.185.72:14402 PS: 龙之谷的同一个channel进程中的line之间的切换,是不需要断连接的。 但是,不在同一个channel进程中的line之间的切换,是断旧连新的。 这样归并多个line实现到一个channel进程的好处是,这几个line之间可以进行 某些形式的互动,比如组队:和同channel其他line的玩家组队,会实时跳转line。 本质上相当于MMORPG中的场景跳转而已。 --------------------------------------------------------------------- 其实相比起这个服务器结构猜测;更应该总结的是游戏的各种优秀的策划设定。 抽空另写一篇总结一下。这游戏我应该还会继续玩下去*_*。 --------------------------------------------------------------- |
|