[原创]龙之谷服务器构架结构设计实现分析
by AKara 2010-07-24 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @ weibo.com/akaras
由于朋友介绍,周末陆续玩了两天 龙之谷(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中的场景跳转而已。
---------------------------------------------------------------------
其实相比起这个服务器结构猜测;更应该总结的是游戏的各种优秀的策划设定。
抽空另写一篇总结一下。这游戏我应该还会继续玩下去*_*。
---------------------------------------------------------------------
by AKara 2010-07-24 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @ weibo.com/akaras
由于朋友介绍,周末陆续玩了两天 龙之谷(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端随机打乱,
这设定一定程度上分流了第一次选服的玩家(但对已有角色的用户来说,不方便);
也分流了每次进服后选频道的玩家(因为各频道共享角色数据,所以是等价的)。
---------------------------------------------------------------------
先贴一下我初步猜测中的龙之谷的服务器部署结构图:
![龙之谷服务器结构 龙之谷服务器结构](http://hi.csdn.net/attachment/201009/19/213345_1284896628zsg5.jpg)
然后下面是对这个猜测的一些分析过程的数据。
希望同对这方面感兴趣的朋友也提供一些纠正或想法~
---------------------------------------------------------------------
在 [进程开始->进入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中的场景跳转而已。
---------------------------------------------------------------------
其实相比起这个服务器结构猜测;更应该总结的是游戏的各种优秀的策划设定。
抽空另写一篇总结一下。这游戏我应该还会继续玩下去*_*。
---------------------------------------------------------------------