MMO 的排队系统
这两周那是忙的天昏地暗。都是些琐碎的事情,两个项目的。理理代码,发发邮件,打打电话,改改 bug ,开开会,签签字,写写报告。周末也加了一天班,工作居然是安装一个论坛系统,外加修改 css ,以及修改模板,调整版面。没办法,时间紧,人手少。
btw, 在服务器上装 php 时,因为开始 ports 没有更新,出了好多问题。mysql 一开始忘记装 gbk 的支持,困扰我老半天。鄙视一下公司购买的某著名 php 写的论坛系统,居然默认不是用 utf-8 编码的。
闲话扯到这里,今天想谈一下上月底,四年逢一次的好日子里,我们公司憋了好久的《天下2》终于又一次体验测试的事情。
首先需要承明一点,我个人不在天下组里,人也不在一起工作。具体细节所知寥寥,甚至不比天下2的老玩家知道的更多。完全是以一个局外人的身份做出评论。
不过我毕竟是网易的老员工,对天下组的同事们私交甚厚。
天下程序的总负责人,是在大话西游一项目失败后,从网易其他部门的技术骨干中被亲点过来加入游戏部的,也是我在大话西游二项目中的老搭档。零四年到现在一直在负责天下这个项目的技术部分。技术有相当的功底,做项目谨慎小心,考虑缜密。我一直认为大话西游二一改前代的程序不稳定的面貌,此人功不可没。不过我个人觉得,他技术上过于保守,在尝试不成熟的技术和想法时有点过于谨慎。
天下组的另几个程序,在当年写作《我的编程感悟》时,曾经就一些技术问题做过反复和深入的讨论(他们的名字我都列入了书里的致谢名单)。都是相处很愉快,可以一起交流技术观点的优秀程序员。
还有几个家伙,大学没毕业就到公司来实习,是我带他们的实习项目。甚至招聘期间就是我自己做的面试和笔试。后来也曾在我负责的项目中工作。当年成立新工作室,有过带出来的想法,都因为能力优秀,被天下这个重点项目留了去,未能得逞。至今甚为遗憾。
套完老交情,下面可以开始不客气的批评了 :) 这次新版的天下2 的登陆排队系统(是 Big world 后来新版官方加的吗?没去了解)真是做的太糟糕了。
据说这次“体验测试”,一共发放了 5000 个帐号。当是限制比较严格的,我自己也没有号。倒是我们这里另一个同事是某个游戏大公会的成员,分到一个号,得以第一时间上去看看。我也旁观了这个游戏。
那么,理论上峰值同时登陆进游戏的人数应该不超过 5000 人了吧。离 big world 的理论计算的压力承受能力差的远呢。所以说,理论和实际是有差距的。购买 big world 引擎的开发商很多,但能向网易这样投入大量技术精英参与改进的公司恐怕不多。如果网易都不能把 big world 用好的话,我看别的开发团队也难。
前几个月,John Romero 来拜访我们公司,我特定慕名去上海见了一面。他们也想(正在?)开发 MMO ,席间问及 big world 的情况,我毫不客气的指出 big world 诸多缺点。关键的一点就是 big world 设计之初更偏向于 FPS 的类型,把大量的 cpu 和带宽放在了角色间 3d 空间位置同步上了。这很可能不适合 其它 MMO 类型游戏。我坚信,在目前的硬软件条件下,MMO 用的 engine 一定要恰如其份的适合设计人员构思的游戏类型。想通过购买现成的 engine 来减少开发成本,本意虽然不错,但功用可能有限。
当然,通用 engine 这条路迟早会走下去的。在不远的将来某一天,CPU 和带宽都按照摩尔定律发展下去,一些条件的制约会弱化。正如今天 3d 显卡和软件接口的发展一样,总有 Unreal 3 这样的优秀 3d engine 大行其道。
好象又跑题了,打住打住 :)
说回排队系统。大家都说 MMO 里的排队系统是魔兽世界的首创。可是只要是有社会经验的人,一拍脑袋就能想出这个点子来。谁都知道,在大量人拥挤在一起想完成同一件事情时,排队遵守次序是提高整体效率的最佳方案。那么,为什么 MMO 发展了那么多年,只到 wow 才被用于玩家登陆?
理由只有两个:1. 问题(太多玩家同时登陆)不存在,不需要去做。 2. 做这样一个排队系统,有一定的技术难度,不容易做好。
29 号那天下午,天下的排队系统是启动了的。可是似乎不解决任何问题。反而大量不能进入游戏的玩家在排队系统中拥挤着,甚至导致了系统不稳定,进入游戏的玩家纷纷掉线。
到了 1 号,开发组似乎把排队系统关闭了。游戏服务器达到承载上限的时候,干脆拒绝任何新的连接。这个时候玩家看到的只是服务器没有回应。讽刺的是,这个时候,游戏服务器反而稳定下来,至少已进入游戏的玩家可以正常游戏了。
任何能弄清楚到底需要什么的项目,在工程上都是容易实现的。无非克服技术点而已。(反之,需求模糊的东西,就很难顺利完成。这也是 MMO 游戏业抄袭成风的根源。毕竟抄袭让我们知道该做些什么。)我相信排队系统终究可以完美实现。下面分析一下排队系统的需求,和技术难点。
让服务器组可以在短时间接纳大量的连接,并将暂时不能处理的连接分流。分流的连接必须保持住,而不能随意丢掉,避免这些断开的连接重新(人为)回来,再次造成冲击。
这里的难点其实在于,系统如何做这样的分流,让处理排队业务的部分不成为游戏逻辑处理业务的桎梏。btw, bigworld engine 还有一个难点,由于它设计之初的决定,通讯协议采取了 UDP 而没有使用 TCP ,所以保持连接更加困难。我并没有说使用 UDP 协议通讯有任何不好(对于 big world 的整体设计来说,采用 UDP 是正确的),只是这里的确造成了一定的技术困难。
以我有限的技术眼光,能开的药方还是从最近两年在忙的这摊子事中得到的。那就是:
身份认证系统分离。参考我以前写的 多服务器的用户身份认证方案 ,身份认证系统可以单独想办法做成集群,处理大量并发请求。但由于每通过一次身份认证只能拿到一次性令牌,这样就在身份认证系统和游戏系统之间做了一个缓冲层。
采用连接服务器和逻辑分离的设计。并且为一组服务器增加多个连接入口点。可参考:游戏服务器处理多个连接入口的方案 。这样,即使游戏服务器组同时只能处理千级别的玩家,连接服务器组一样可以承受万级别的同时连接数。同时可能方便的留出特殊通道供内部人员使用。据说前两天,天下服务器拥挤的时候,我们自己的 QC 人员都没能登陆进游戏系统。更别说老板想进去看看游戏了 :) (我不赞同内部人员就能比外部玩家有更多的特权,实际上网易的游戏一直也是这么坚持的。但是维护和测试人员在测试期也挤不上游戏服务器就有点搞笑了)
游戏系统尽量使用多进程流水线设计。参考:多进程的游戏服务器设计 。把排队系统独立到一个进程里,放在连接服务器之后。在负载过高的时候,单独分配到一台物理机器上工作。游戏排队系统逻辑简单,并可以维持较低的通讯/心跳频率,所以单台机器处理几万逻辑连接(真正的海量 TCP 连接是在连接服务器上做的)是没有什么问题的。
这里,处理排队的进程,实际也担负了监控游戏服务器组的负载的任务。所以它可以在正确的时候放行排在前列的玩家。独立的进程使它不至于影响正常游戏的逻辑处理。这样一个子系统,我们的 engine 中被称为 watchdog ,代码不过几百行。这块设计在 去年底的那次演讲 中也讲过了。不知道当时在场的朋友中有没有人关注。 :)
以上提到的诸点,并非在 big world 中全无。只是 engine 开发受制于人,又有些许沟通上的障碍。最终制约了我们自己的技术人员解决问题的粒度和速度。我想,若是欧美厂商购买了 big world ,能够用的更好吧。
现实是复杂的。没做到,没做好,并非我们的程序员不能也。
3 月 3 日补充:
这两天好几个天下组的同事找到我,给我讲这件事情的经过 :) 原来并不是排队系统没有做好。而是别的原因。(包括一些其它 bug ,服务器初期玩家过于拥挤在同一地点等)现在游戏服务器已经很流畅了。
Comments
Posted by: 学徒 | (26) April 14, 2008 12:26 AM
Posted by: kelsen | (25) March 18, 2008 04:27 PM
Posted by: lbaby | (24) March 13, 2008 02:42 PM
Posted by: pnking | (23) March 7, 2008 05:46 PM
Posted by: Anonymous | (22) March 5, 2008 11:27 PM
Posted by: Cloud | (21) March 5, 2008 11:14 PM
Posted by: 少侠 | (20) March 5, 2008 10:47 PM
Posted by: Anonymous | (19) March 5, 2008 05:44 PM
Posted by: kelvinwang | (18) March 5, 2008 10:19 AM
Posted by: 技术可是 | (17) March 5, 2008 09:54 AM
Posted by: Rain | (16) March 5, 2008 09:13 AM
Posted by: nothanks | (15) March 5, 2008 08:59 AM
Posted by: alioxp | (14) March 5, 2008 08:49 AM
Posted by: 少侠 | (13) March 5, 2008 12:08 AM
Posted by: wei | (12) March 4, 2008 09:04 PM
Posted by: Anonymous | (11) March 3, 2008 10:23 PM
Posted by: kelvinwang | (10) March 3, 2008 04:38 PM
Posted by: yayv | (9) March 3, 2008 11:09 AM
Posted by: 羽扬 | (8) March 2, 2008 08:51 PM
Posted by: BlueJia.Cn | (7) March 2, 2008 08:31 PM
Posted by: Anonymous | (6) March 2, 2008 07:45 PM
Posted by: Anonymous | (5) March 2, 2008 07:43 PM
Posted by: eating | (4) March 2, 2008 05:58 PM
Posted by: chinainvent | (3) March 2, 2008 05:26 PM
Posted by: sheep | (2) March 2, 2008 05:16 PM
Posted by: Jeanva | (1) March 2, 2008 04:46 PM