过去一年中,花了很多时间在考虑服务器架构设计方面的问题。看了大量文章、也研究了不少开源项目,眼界倒是开阔了不少,不过回过头来看,对网游架构设计方面的帮助却是不多。老外还是玩儿console game的多,MMO Games方面涉及的还是不如国内广泛。看看 Massively Multiplayer Games Development 1 & 2 这两本书吧,质量说实话很一般,帮助自然也很有限。当然这也是好事,对国内的研发公司/团队来说,在网游服务器技术方面当然就存在超越老外的可能性,而且在这方面技术超越的机会更大,当然前提是要有积累、要舍得投入,研发人员更要耐得住寂寞、经得起诱惑,在平均每天收到超过3个猎头电话的时候——依然不动心。
上面有点儿扯远了,下面聊聊无缝世界架构(Seamless world server architecture)设计方面的一点儿看法。
先说架构设计的目标——我的看法,服务器组架构设计的目标就是确定各服务器拓补关系和主要的业务逻辑处理方法。主要要解决的问题就是在满足游戏内容设计需要的前提下,如何提高带负载能力的问题。
上面两个序列图描述的是某个玩家做了连续做了两次同样的操作但是很可能得到了不同的结果,当然这些请求都是异步地被处理。问题的关键在于——尽管两次玩家执行的命令一样、顺序一样,甚至时间间隔都一样,但是结果却很不同——因为图(1)里面C2CS::Request_to_attack请求被处理的时候,C2IS::Request_equip_item 这个请求还没有被处理完,但是图(2)显示的情况就不一样了。因为C2IS::Request_equip_item这个操作很可能会改变游戏人物的属性,这个属性又很可能影响attack的结果。这两幅图实际上省略了 Combat Server 与 Item Server 之间的交互过程。但是已经足以说明问题了,每个Service处理每个Request时具体会消耗的时间,是无法在设计时确定的!
谁喜欢这类结果上的不确定性?举个例子:玩家很可能已经装备上了“只能使用1次的魔兽必杀刀”然后攻击了一下魔兽,但是它却没死!这会导致什么样的结果?请自行想象。另外,这种不确定性还会表现为“在项目开发期和运营期的行为差异”,或者“出现某些偶然的奇怪现象”。
那还有解决方案么?有的,其实只要序列化玩家请求的处理,使处理有序进行就可以了。但是又一次的,这会带来新的复杂度——在某个范围(整个服务器组?一个行会?一个队伍?)内,以每个玩家为单位,序列化他(们)的(可能是所有)操作,但是也显而易见,这在某种程度上降低了请求处理的并发性,尽管它对并发性的影响可能只局限于不大(最少是一个玩家)的范围。