服务器架构
服务器集群承载着虚拟世界的各个实例。集群之间可能存在由程序设定的差异(例如,在某个集群里可以攻击其他玩家,在另一个集群里则不行),但这些差异在形式上通常很小,效果上则未必。一个集群里有多少台服务器,因实现而异,但通常也就六台上下。集群的数量同样不等:一款产品越受欢迎,增设的集群就越多(《无尽的任务》——EverQuest——在 2000 年达到 40 个服务器集群,高峰时段平均每个集群同时在线约 1,500 名玩家)。
图 2.2 展示了一个服务器集群通常是怎么配置的。

各个客户端分别连接到各自的子服务器。理想情况下,每台子服务器完成的工作量都与其他子服务器相同(实践中,这意味着它处理的玩家数量相同)。子服务器可以访问一个共享的角色数据库 1,其中存放着本集群中玩家角色的持久数据 2。它可能是某个用于管理玩家访问权限的全系统账户数据库的一部分,也可能不是。出于可维护性的考虑,大型虚拟世界通常会为环境数据单独维护一个数据库,这个数据库又可能划分成模板数据库、脚本语言数据库和实例化数据库(第 1 章描述过这种划分)。
此外,这些世界/环境数据库是共享的(如图所示),还是各台子服务器本地各有一份,取决于负载均衡的实现方式。以《无尽的任务》的分区系统为例,它用不着那么大的环境数据库,由各台子服务器各自管理自己那份就行;各台子服务器之间只有角色数据库需要共享,供角色在分区之间移动时使用。当然,这样做要在别的方面付出代价,这一点我们稍后就会谈到。
服务器集群在硬件上就是一堆 PC 或者更强悍的硬件(通常运行着某种 Unix 变体),用局域网连在一起。
图 2.2 画出了服务器各组成部分之间通常的通信路径;但事实上,只要有需要 3,任何一台子服务器都能与任何其他子服务器通信。
因此,在子服务器之间转交玩家,既可以采取正式的做法(经由数据库),也可以采取非正式的做法(靠机器之间直接协商)。各台子服务器也可能与用户数据库有联系,如图 2.1 所示(图 2.2 里没有画这条线,免得这张图被虚线画死)。
我要指出的是,学术界正在试验别的架构,尤其是科幻小说里最受青睐的那种分布式架构(例如《虚拟偶像》和《异域》都用了它)。不过,由于会带来安全与责任问题,这类架构以及涉及组播(multicast)的架构,都不太可能在学术界之外得到应用。