2007年,“SecondLife”三维虚拟风暴席卷了现实世界。原本定位为人生模拟类在线游戏的SecondLife,现在已经逐步演变成为一个国际化的在线模拟社区。人们在其中进行虚拟房地产交易,艺术家开办自己的作品展览,作为世界5大会计事务所之一的毕马威展开招聘工作,BBC等老牌传统媒体配备了SecondLife特派专职记者,时尚巨头阿玛尼也开了专卖店。现实世界中的一切,都可以在SecondLife中找到对应之物。不难想象,能够产生如此巨大影响力的SecondLife,其庞大的虚拟世界背后必然有优秀的技术架构作为支持。接下来就让我们一起来看看其中端倪。
SecondLife服务器构成
SecondLife(下简称SL)的服务器端包括这六大类服务器:Login server(登陆服务器);User server(用户服务器);Space
server(空间服务器);Data server(即数据服务器);Simulator(即模拟器),常被称为SIM;Other
servers(其他服务器),包含若干不同功能服务器,林登公司(Linden)似乎对它们的详情有所保留。
下面对这六大类服务器进行详细解释。
1、Login
server,登录服务器。是运行在login.agni.lindenlab.com上的CGI脚本。顾名思义,就是用来验证用户名和密码的。验证后还要决定用户登录到什么区域:是用户的家、还是上次离开SL时的区域或者URL指定的某个区域。接下来要找到运行该区域的模拟器,验证用户是否被允许连接到该区域。最后向模拟器发出连接请求,并告知客户端连接到何处。
2、User server,用户服务器。曾被用来处理用户登录,即登录服务器现在的功能。现在负责管理即时通讯(instant
message)会话,尤其是组内即时通讯。
3、Space
server,空间服务器。处理基于不同网格X,Y坐标间消息的路径选择。模拟器与空间服务器会话以便被其登记在案,还可以发现自己的邻居是谁。作用与网络概念中路由器相仿。
4、Data
server,数据服务器。处理与中心数据库、日志服务器、仓库数据库以及搜索数据库的连接(上述4种服务器属于第6类其他服务器),代表模拟器运行查询。(注: SL
服务器网格中只有一个中心服务器,日志服务器,而仓库服务器以及搜索服务器分别有多个,或者在某个范围内,前两者与后两者分别是一对多的关系。)
5、Simulator,模拟器。这是SL最主要的服务器。每个模拟器模拟一个256*256平米的整块区域。当SL客户端浏览器满虚拟世界转悠时,实际上是在不同的模拟器间被倒手。模拟器的任务有:存储物体状态、土地状态、地形海拔图状态。模拟器还负责计算物体和土地的能见度,并把计算数据传送给客户端。模拟器还使用优先级队列传送图像数据。还有一种物理学模拟器专门掌管Hovak物理学例库[1]。公共谈话(Chat)和即时通讯(instant
message)也由模拟器处理。全速运行时,模拟器可达每秒45帧,如果不能保持全速,它将在不减低帧速率的情况下尝试时间膨胀[2],在Second
Life中如果不能全速,则会以物体显示延迟为代价,而不会影响已显示物品的质量,这种效果也被叫做Lag。
模拟器两两之间以UDP网络连接进行通信,并由相邻的模拟器保持通信连接。
要注意的是:在Second
Life中,模拟器与客户端浏览器(Viewer)之间的区别与其他虚拟环境差异较大。模拟器负责运行物理引擎,碰撞检测,跟踪每一事物和用户化身Avitar的位置,将物品的位置发送给客户端,必要时将更新的数据发送给客户端(只有当发生碰撞或者方向和速度变化等情况下才会有这种更新)。而客户端负责处理本地物品的位置,获取速度等物理学信息,进行简单的物理学运算以跟踪何物向何处移动,不进行碰撞检测。
6、Other servers,其他服务器,其中包含若干规模较小的服务器。下面一一说明:
l 中央枢纽:在SL的官方网站上没有给出说明,但根据字面意思推断,应当与全局通讯、调度以及分布式运算有关。
l
代理数据库:掌管元数据与项目id(UUID)之间的映射。代理(Agent)一词在SL中特指与用户化身(Avatar)相对应的后台底层的唯一表示,在SL计算机系统中有唯一识别号,简称UUID,该号码与用户是唯一对应且持久存在的。其他物品也有UUID,但物品的UUID是在物品放置于虚拟世界中时临时生成的,不是持久的UUID。元数据是指在Second
Life中不可分的数据,比如构成物体形状的基本单元(prim),或者一张纹理(texture)。一个物体可能由多个元数据组成,因此需要记录元数据与物体,也即是此处所称的项目之间的关系,而代理数据库就承担此责任。同时,任何物体都有唯一拥有者,记录物体的拥有者,也是代理数据库的任务。
l
中心数据库:官方文档描述该服务器存储谁拥有什么,用于记录账单,而实际上远不止这么简单,但囿于目前所能取得的资料,很少有对其详细的叙述。
l
搜索数据库:中心数据库的副本,用于搜索。可以断定,为了提高搜索效率,此数据库一定保有大量索引。而中心数据库为了保证数据写入和修改的效率,使用的索引肯定是比较少的。
l 地图服务器:使用OpenGL绘制全局地图。Second
Life客户端也是使用OpenGL绘制的,此外普通网页上的SL地图使用的是Google的地图API。
l RPC服务器: XML RPC(远程过程调用)服务器。其作用包含:开发者需要的,不通过客户端浏览器来操作Second
Life的API,可将XMLRPC服务器代码翻译为in-world请求,与空间数据库和中心数据库通讯。
SecondLife用户登录验证步骤解析
我们不妨通过分析登录验证的步骤,来看看这些服务器是如何进行互相通信的。流程可参见文后图示。
1. 客户端对用户服务器发出安全信息校验和(Checnsum)请求,端口号:12036。
2. 客户端对登录服务器发出登录请求:
a) 通过HTTP打包发送XML RPC进行登录;
b) Web服务器(多数情况下是Apache)与SQL数据库通话,获得用户信息,连接模拟器所需信息(比如IP地址)并生成连接;
c) 用户帐号名称,MD5口令,客户端版本,登录地址请求。
3. 登录服务器从数据库获得授权证书。
4. 登录服务器与网格中的模拟器对话:
a) 决定哪个模拟器负责该客户端;
b) 请求会话开始;
c) 网格返回与客户端通讯的UDP端口号 12035,13000-13050
5. SIM响应登录服务器,告知用户是否允许登录到模拟器。
6. 登录服务器响应客户端:
a) 返回的信息有,用户id,会话id,安全会话id,模拟器IP,模拟器端口号,全局坐标,用户仓库信息等;
b) 大部分id都是UUID(比如用户id,会话id,安全会话id);
c) 用户id是唯一的,并且是永久的。
7. 客户端与模拟器握手,并发送用户id和会话id。
8. 客户端与用户服务器握手:
a) 发送出席信息,以便收到组及时消息(Group IM);
b) 给用户授予组权限;
c) 用户服务器验证模拟器会话信息(在数据库的Presence-Agent表中)。
结语
以上是对SecondLife架构的一个简要介绍,目前国内已经出现了类似SecondLife的在线虚拟游戏/社区,希望本文能够为大家提供一些启示,同时也期待国内的架构师们出来分享自己的经验与心得。
说明:本文部分内容译自SecondLife官方wiki。
--------------------------------------------------------------------------------
[1]简单地说物理学模拟器负责物理学相关的运算,比如重力加速度的效果,不同物体的空间占位关系等。Hovak是服务器端系统(grid)的代号,即将发布的是Hovak4。
[2]物理学名词,来自相对论。时间并不是永远以我们感受到的当前这种速度进行的,它也会发生变化;一般和速度有关。速度越快,越接近于光速,时间就会越慢