MMOG Dir Server 概要设计.docx
《MMOG Dir Server 概要设计.docx》由会员分享,可在线阅读,更多相关《MMOG Dir Server 概要设计.docx(9页珍藏版)》请在冰豆网上搜索。
MMOGDirServer概要设计
MMOGDirServer概要设计
拟制:
Willim
日期:
2004-09-07
审核:
日期:
深圳市腾讯计算机系统有限公司
版权所有不得复制
文档历史
修订日期
修订内容
协议版本
修订人
2004-9-07
created
V0.1.0
willim
目录
1简介5
1.1约定5
1.2玩家登陆的过程简介6
1.3目录服务器的功能需求6
2DirServer的结构7
2.1系统结构7
2.2内存中的ZoneServer组信息7
2.3DirServer的配置文件范例8
3消息接口定义及处理9
3.1在线人数上报9
3.2获取游戏区信息9
3.3选择游戏分区10
3.4消息流程11
4其它注意事项11
4.1zoneserver与地图的分布关系11
4.2GameClient保存最后登陆的ZoneServer信息12
MMOGDirServer概要设计
关键词:
Dirserver,目录服务器
摘要:
本文是MMOG目录服务器的概要设计,包含DirServer逻辑结构、与其它Server之间的接口消息描述。
缩略语清单:
DirServer目录服务器
IDC数据中心
1
简介
1.1约定
1、ZoneServer服务器组:
可以由1~N台ZoneServer服务器组成处理游戏的逻辑,每个ZoneServer负责若干地图,合起来是一个完整的游戏世界。
一个ZoneServer服务器组相当于《传奇》的一个分区或者《凯旋》的一条线(Line)。
2、WORLD:
在WORLDSERVER上保存了角色数据,它可以由多个ZoneServer服务器组组成,各服务器组的地图可以是相同的(类似于平衡世界),玩家的角色数据在各个ZoneServer组之间是共享的,也可以自由切换。
一个WORLD相当于一个游戏区。
3、CLUSTER:
在CLUSTERSERVER上保存了帐号数据,主要用于计费。
一个CLUSTER相当于一个游戏大区,可以由若干个WORLD组成,各WORLD之间的数据不共享。
视乎在线人数规模及不同IDC的合作需求,CLUSTER可以和WORLD数据存储在一起。
从运维成本和扩展方面考虑,一个IDC最好独立为一个游戏大区。
理想状态下在一个IDC所建立的《幻想》系统结构图:
1.2玩家登陆的过程简介
玩家启动GameClient应用后,连接到玩家所选择的某一DirServer,从该DirServer所提供的可用服务器组中选择一个将要进入的分区,由GameClient直接与某一具体的ZoneServer/ZoneConnect重新建立连接后,继续游戏。
1.3目录服务器的功能需求
1、显示各服务器组的忙闲程度
每隔N秒,各ZoneServer向DirServer上报其当时同时在线的人数信息,这相当于DirServer与ZoneServer之间的HeartBeat,若连续M次没收到上报的信息,则认为此ZoneServer不可用。
DirServer以ZoneServer组中某一最多在线人数的ZoneServer的情况作为整个组的忙闲程度,返回给GameClient。
2、提供玩家进入游戏世界的渠道
DirServer提供给玩家可用的游戏分区信息,进入游戏。
3、负荷分担
1)如果玩家只选择某一游戏区(WORLD)而没有选择(ZONESERVER组),DirServer将随机返回一个相对闲的ZoneServer的URL
2)DirServer将根据玩家所选择的ZoneServer组,从该组中选择一个繁忙程度最小的ZoneServer,返回给GameClient。
由Client自己进行判断,是继续联接上一次的ZoneServer,还是当前的ZoneServer。
2DirServer的结构
2.1系统结构
说明:
1、DirServer支持DNS域名访问,它和其它的GAMESERVER功能实体在同一个LAN内,使用BUS进行通信。
每一个IDC/游戏大区(CLUSTER)都至少有一个自己的DirServer
2、DirServer的信息保存在GameClient从本地的配置文件中
3、DBServer代表了WORLDSERVER和CLUSTERSERVER
2.2内存中的ZoneServer组信息
DirServer以SHM的方式保存本游戏大区中各ZoneServer的在线人数信息。
1、一个ZoneServer的信息结构
typedefstruct{
unsignedintiZoneSvrID;//ZoneSvrID:
x.x.x.x格式
intiMaxOnline;//可以达到的最大人数
intiCurrentOnline;//当前的人数
charszConnectUrl[64];//IP+PORT
time_tlLastActived;//最后一次上报信息的时间
}ZoneSvr;
2、ZoneServer组结构
#defineMAX_ZONE_SVR_IN_A_GRP8
typedefstruct{
shortnActiveZoneSvr;//当前组中可用的ZoneServer个数
charszGroupName[32];//ZoneServer组的名字
ZoneSvrastZoneSvrGroup[MAX_ZONE_SVR_IN_A_GRP];
}ZoneSvrGroup;
根据ZoneServerID中的第2个Byte,可以知道这个ZoneServer属于哪一组(请参见《MMOGSERVER功能实体编号》,下同)。
3、一个WORLD中所有的ZoneServer组
#defineMAX_ZONE_SVR_GRP16
typedefstruct{
shortnGrpNumber;
charszWorldName[32];//游戏区的名字
ZoneSvrGroupastZoneSvrGrp[MAX_ZONE_SVR_GRP];
}GameWorld;
根据ZoneServerID中的第1个Byte,可以知道这个ZoneServer属于哪一个WORLD。
4、一个CLUSTER中的所有WORLD
#defineMAX_WORLD16
typedefstruct{
shortnWorldNumber;
charszClusterName[32];//大区名字
GameWorldastGameWorld[MAX_WORLD];
}GameCluster;
2.3DirServer的配置文件范例
在ConfigServer开发完之前,DirServer中关于各ZoneServer的配置文件举例如下:
1、game_cluster.cfg
[World]
WorldID=1
WorldName=XXX
WorldConfig=world_1.cfg
[World]
WorldID=2
WorldName=YYY
WorldConfig=world_2.cfg
2、world_1.cfg
[ZoneSvrGroup]
ID=1
GroupName=XXX
[ZoneSvrGroup]
ID=2
GroupName=XXX
3消息接口定义及处理
DirServer与GameClient、ZoneServer之间的通信数据包结构沿用ZoneServer与GameClient之间的通信结构,由包头(含扩展包头)及包体组成,请参见《神剑CS协议》。
3.1在线人数上报
1、本消息由各ZoneServer发送给DirServer,无须应答
2、消息ID:
SS_ZONESVR_HEARTBEAT
消息体:
typedefstruct{
intiCurrentOnline;//当前的人数
intiMaxOnline;//可以达到的最大人数
charszConnectUrl[64];//本ZoneServer的连接IP和监听PORT
}ZoneSvrInfo;
ZoneServerID存储在BUS结构的iSrc字段。
3.2获取游戏区信息
1、请求:
由GameClient发送CS_CMD_GET_GAMEZONE消息
消息ID包含在包头中,无须消息体。
2、响应:
由DirServer返回CS_CMD_GET_GAMEZONE结果
消息体:
typedefstruct{
charcGrpId;
charszGrpName[32];
charcBusy;
}ZoneGroupList;
cBusy分为:
0优秀,1良好,2繁忙3非常繁忙
typedefstruct{
charcWorldId;
charszWorldName[32];
shortnGrpNumber;
ZoneGroupastZoneGrp[MAX_ZONE_SVR_GRP];
}WorldList;
typedefstruct{
shortnWorldNumber;
WorldListastWorld[MAX_WORLD];
}ClusterInfo;
返回消息:
typedefstruct{
charcResult;
union{
ClusterInfostCluster;
charszErrMsg[128];//错误信息
}
具体请参见ov_cs.xml/ov_cproto.h中的数据结构定义。
3.3选择游戏分区
1、请求:
由GameClient发送CS_CMD_CHOOSE_SUBWORLD消息,选择一个ZoneServer组
消息ID包含在包头中。
消息体:
typedefstruct{
charcWorldId;//游戏区编号,WORLDID
charcZoneSvrGrpId;//游戏分区编号,ZoneServer组的编号;
//如果为0则表明由Server自动选择一个ZoneServer
}ChooseZoneRequest;
2、响应:
由DirServer返回CS_CMD_CHOOSE_SUBWORLD结果,包含了一个可进行连接的ZoneServer的URL信息
消息体:
typedefstruct{
charcType;
union{
charszErrMsg[128];
charszConnectUrl[64];//具体的某个ZoneServer/ZoneConnect的连接IP和端口
}
}
具体请参见ov_cs.xml/ov_cproto.h中的数据结构定义。
DirServer在接收到CS_CMD_CHOOSE_SUBWORLD请求后,将从该ZoneServer组中选择一个相对闲的ZoneServr,返回给GameClient,以便后者重新建立连接,进入游戏。
3.4消息流程
4其它注意事项
4.1zoneserver与地图的分布关系
一个zoneserver负责若干张地图,而zoneserver能容纳的在线人员是有限制的。
玩家在发生角色切换时,并不一定能成功。
所以,对于容易造成“热点”的地图,比如新手村、某一类怪物集中的地方,在进行地图分布设计时,需要预先避免都集中到一个zoneserver所负责的地图里。
4.2GameClient保存最后登陆的ZoneServer信息
若DirServer返回的zoneserver信息和上次该玩家登陆的zoneserver不一致,而且两者都属于同一个WORLD时,GameClient应先与后者进行连接进入游戏,尽量地减少服务器端隐含的切换zoneserver动作(在目前的处理流程下,完全避免是不可能的)。