跳转到主要内容

总体架构

实际的架构因开发者而异,但它们几乎都可以看成同一种通用做法的变体,这种做法的着眼点是可靠性、可扩展性与可维护性。图 2.1 展示了这种总体架构。

图 2.1
图 2.1 总体架构

下面说说它是怎么运作的。

系统的核心是用户数据库。这是一套功能强大的软件,独占一台速度很快、存储空间很大的机器。它保存着所有注册到这个虚拟世界的玩家的记录。任何人都必须先登录,才能访问内容;而登录就意味着要到用户数据库里去核对。整个系统里负责计费、客户服务管理与打补丁的其他部分(图 2.1 中没有画出)同样可以访问用户数据库。这是一套非常重要的工业级系统,因此通常是买现成的,而不是自己内部开发。

玩家接入虚拟世界有若干种选择。主要的一种是用 PC 上的客户端连进来(或者用家用主机、Macintosh 或 Linux 机器——这些客户端呈现的界面都相同,所以虚拟世界既不知道、也不在乎它们跑在什么操作系统之下)。玩家也可以用浏览器连上服务器,不过这么做的远不如用专门定制客户端的多;虽然确实有一些文字虚拟世界拥有不错的基于浏览器的(Java)客户端,但还没有人鲁莽到为一款成熟的 3D 图形虚拟世界做同样的事。同样,手机离能真正拿来玩还差得远。不过,浏览器和手机都可以用来从虚拟世界获取信息(例如新闻、虚拟天气),或者修改常设指令(例如训练安排、待售商品的定价)。手机与电子邮件可以用来向玩家通报正在发生的事件,但通常不提供参与其中的机会。

当有连接从外部接入时,就由前端(front end)来处理。前端既能与自己的目标平台(客户端、浏览器/电子邮件、手机)通信,也能与用户数据库通信。图 2.1 把各个前端画成彼此独立的实体,因为它们各自是独立的进程;不过在实际部署中,它们可以合并到一台机器上,也可以拆到好几台机器上(例如按现实世界的地理位置来分)。

虚拟世界的每一个化身都托管在服务器集群上,集群又称 shard(分片)1。

shard 的架构稍后会详细讲述,不过眼下不妨就把一个 shard 简单地看成一个服务器实体。前端在准许某个玩家访问内容之后,要么向与该内容相关的服务器发起查询(浏览器或手机的连接属于这种情形),要么把控制权直接交给服务器本身(客户端连接属于这种情形)。服务器为支持虚拟世界,并不需要访问用户数据库,因为服务器打交道的是角色,而不是玩家。但客户支持人员打交道的是玩家,而不是角色,所以他们确实需要在虚拟世界内部就能查看用户数据库。这件事有时是靠一个单独的数据库工具来做的:在照常使用普通客户端的同时,他们可以调用这个工具;但并非总是如此。尤其是,如果客户端把玩家的 PC 整个占用 2,那就得有一个特殊的管理客户端,把数据库工具内建其中。

如果是这样,那么要么客户端必须能保持两条连接(一条连服务器,一条连用户数据库),要么——更省事的办法是——服务器本身在需要时发出数据库请求,再把结果送回客户端。


  1. 这个叫法源于《网络创世纪》(Ultima Online)里的一段虚构设定,为的是解释一个据说只有一份的世界怎么会有多份副本。这就好像一面映照世界的镜子碎成了无数细小的碎片,每一片这样的碎片都映出原本的世界,只是映法略有不同。 ↩︎

  2. 这里取其“客户端运行期间不许其他进程运行”之义,以此给黑客添麻烦。但这样做也会给非黑客添麻烦,所以客户端也许退而求其次,只求独占屏幕。玩家对此举一般仍然不领情。 ↩︎