上一篇文章我们分析了ryzom的内存分配策略,ryzom还有很多其他的基础模块,我们将在以后分析ryzom服务端架构的时候再介绍,今天我们来看一下ryzom的登陆流程.
一个ryzom的游戏世界由多个服务组成,在登陆的时候主要涉及三个服务:su(shard unifier service), ws(welcome service), fes(front end service).此外还有一个用php写的http server,他们之间的关系见下图:
Su服务:集成了login和ring_session_manager服务, ring_session_manager放到后面再说,这次主要介绍longin服务,su服务是唯一的,所有的ws都连接su服务,ryzom这样做的原因是ryzom一共只有三个游戏世界.
Fes服务:就是我们平常所说的gateway服务器.
Ws服务:ws服务就相当于一个dns服务器,所有的fes服务会主动连接ws服务,当有客户端要求进入这个游戏世界时,它会找到最合适的一个fes,然后把这个fes的ip和port告诉客户端,ws也会更新和汇总各个fes的负载,告诉su服务.
登陆流程见下图:
不过我不太明白,为什么在用户密码验证这里要用web方式,这个需要好好研究一下,它的用户密码验证就是用php的crypt函数加密,然后比较一下是否相等,个人觉得有点过于简单,我还是比较推荐srp6这样的方式,有兴趣的同学可以自己google或者看mangos的代码。
因为ryzom一共只有三个游戏世界,所以只有一个login服务是ok的,但是我认为这样并不适合一般的大型mmorpg,特别是有多个大区,每个大区有多个游戏世界的情况.虽然我们不知道wow是怎么做的,但是通过看mangos的代码,我们也能大概猜到一些.首先应该把login服务解耦出来,这样一个大区的login服务器可以动态分配,根据需要增减服务器,具体分配给玩家哪个登陆服务器,用一个dns来分配,这样可以轻松的实现均衡负载,当然了自己实现一个也不难.大区内的游戏世界主动连接到一个游戏世界管理服务器,登陆服务器通过游戏世界管理服务器获悉游戏世界列表,wow是登陆服务器每隔5秒钟发送游戏世界列表给客户端,我们是不是需要这么做还是要斟酌.如果有哪个游戏世界当机了,游戏世界管理服务器会广播给所有的登陆服务器.
所以在分析和学习ryzom的架构和代码时,还是要弄清楚哪些是自己需要的,在要用某样东西前,一定要先充分的了解它,要不然它就是一柄双刃剑.下一篇文章,我打算进入ryzom的游戏世界中,先大致看一下它的游戏世界由多少个服务组成,以及这些服务之间的关系.