转自:
http://www.cppblog.com/johndragon/archive/2008/04/10/46768.html
出于学习目的转载,如果有不妥当或者侵权的话请及时联系~
这个图是一个区的架构图,所有区的架构是一样的。上面虚线框的ServerGroup和旁边方框内的架构一样。图上的所有x N的服务器,都是多台一起的。红线,绿线,和蓝线图上也有图示,这里就不多介绍了。关于Agent Server大家也能看出来,其实就是Gate。
这里主要介绍下图上的标记了号码的位置的数据连接的内容和意义。
1- 这是一条WebService的管道,在用户激活该区帐号,或者修改帐号密码的时候,通过这条通道来插入和更新用户的帐号信息。
2- 这也是一条WebService管道,用来获取和控制用户该该组内的角色信息,以及进行付费商城代币之类的更新操作。
3- 这是一条本地的TCP/IP连接,这条连接主要用来进行服务器组在登陆服务器的注册,以及登陆服务器验证帐户后,向用户服务器注册帐户登陆信息,以及进行对已经登陆的帐户角色信息进行操作(比如踢掉当前登陆的角色),还有服务器组的信息更新(当前在线玩家数量等)。
4- 这也是一条本地TCP/IP连接,这条连接用来对连接到GameServer的客户端进行验证,以及获取角色数据信息,还有传回GameServer上角色的数据信息改变。
5- 这条连接也是一条本地的TCP/IP连接,它用来进行公共信息服务器和数个游戏服务器间的交互,用来交换一些游戏世界级的信息(比如公会信息,跨服组队信息,跨服聊天频道等)。
6- 这里的两条连接,想表达的意思是,UserServer和GameServer的Agent是可以互换使用的,也就是玩家进入组内之后,就不需要再切换Agent。如果不怕乱套,也可以把登陆服务器的Agent也算上,这样用户整个过程里就不需要再更换Agent,减少重复连接的次数,也提高了稳定性。(毕竟连接次数少了,也降低了连不上服务器的出现几率)
在这个架构里面,GameServer实际上是一个游戏逻辑的综合体,里面可以再去扩展成几个不同的逻辑服务器,通过PublicServer进行公共数据交换。
UserServer实际上扮演了一个ServerGroup的领头羊的角色,它负责向LoginServer注册和更新服务器组的信息(名字,当前人数),并且对Agent进行调度,对选择了该组的玩家提供一个用户量最少的Agent。同时,它也兼了一个角色管理服务器的功能,发送给客户端当前的角色列表,角色的创建,删除,选择等管理操作,都是在这里进行的。而且,它还是一个用户信息的验证服务器,GameServer需要通过它来进行客户端的合法性验证,以及获取玩家选择的角色数据信息。
采用这种架构的游戏,通常有以下表现。
1- 用户必须激活一个大区,才能在大区内登陆自己的帐号。
2- 用户启动客户端的时候,弹出一个登陆器,选择大区。
3- 用户启动真正的客户端的时候,一开始就是输入帐号密码。
4- 帐号验证完成之后,进行区内的服务器选择。
5- 服务器选择完成之后,进入角色管理。同时,角色在不同的服务器里不能共享。
市面上符合上面几个表现特征的游戏相当的多,而且也不乏旷世巨作。这个架构不是一个新的架构,但是它足够经典和完善,并且逻辑简单而清晰,用来做MMORPG,或者其它网络游戏的服务器架构,是一种不错的选择。
—————————————————————————————————我是分割线—————————————————————————————————————————————
之后的内容是我们自己的
开发到现在其实是有一些摸着石头过河的感觉的,截至到上周末我们才有了第二个server,是一个聊天的服务器,另一个server独揽大局,负责登陆、记录玩家、存储场景等等看上去很多其实什么都没做。
出于开发简化考虑我们的很多处理以及监测都是在客户端来做的,服务器参与的计算比较少,主要是数据同步转发广播这些功能……
在sprint3里面我们打算做一个新的服务器是计分服务器,换句话说也就是用户服务器了,不涉及到太多逻辑关系,也只是数据上的一些处理。
从上面的框架来看我们的框架简直松散的不堪一击,不过我们有往这个方向来靠拢的想法,毕竟单一服务器工作量太大的话负载高,而且可能造成延迟卡顿等对玩家而言灾难性的影响,
这样将各个功能分离开确实可以提高效率,使整个逻辑结构更加清晰。
只写过各种课程大实验的我感觉架构这个东西实在是神奇……本来架构应该是动工之前就已经敲定好的,我们就那么凭着经验弄到现在……也算是积累了不少的 教训 吧……
从上面转载的内容来看我们的游戏还有比较严重的问题就是我们现在是CLIENT直连各个server的,而缺乏一个中间层也就是agentserver作为媒介来和后面的server沟通,这也是我们项目目前做的不好的一点,
改应该是来不及改了,只能在以后的项目(如果还能接触到类似的项目)中多加注意了。