« 显卡还是 N 卡好啊 | 返回首页 | 基于 lua 的热更新系统设计要点 »

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 是正确的),只是这里的确造成了一定的技术困难。

以我有限的技术眼光,能开的药方还是从最近两年在忙的这摊子事中得到的。那就是:

  1. 身份认证系统分离。参考我以前写的 多服务器的用户身份认证方案 ,身份认证系统可以单独想办法做成集群,处理大量并发请求。但由于每通过一次身份认证只能拿到一次性令牌,这样就在身份认证系统和游戏系统之间做了一个缓冲层。

  2. 采用连接服务器和逻辑分离的设计。并且为一组服务器增加多个连接入口点。可参考:游戏服务器处理多个连接入口的方案 。这样,即使游戏服务器组同时只能处理千级别的玩家,连接服务器组一样可以承受万级别的同时连接数。同时可能方便的留出特殊通道供内部人员使用。据说前两天,天下服务器拥挤的时候,我们自己的 QC 人员都没能登陆进游戏系统。更别说老板想进去看看游戏了 :) (我不赞同内部人员就能比外部玩家有更多的特权,实际上网易的游戏一直也是这么坚持的。但是维护和测试人员在测试期也挤不上游戏服务器就有点搞笑了)

  3. 游戏系统尽量使用多进程流水线设计。参考:多进程的游戏服务器设计 。把排队系统独立到一个进程里,放在连接服务器之后。在负载过高的时候,单独分配到一台物理机器上工作。游戏排队系统逻辑简单,并可以维持较低的通讯/心跳频率,所以单台机器处理几万逻辑连接(真正的海量 TCP 连接是在连接服务器上做的)是没有什么问题的。

这里,处理排队的进程,实际也担负了监控游戏服务器组的负载的任务。所以它可以在正确的时候放行排在前列的玩家。独立的进程使它不至于影响正常游戏的逻辑处理。这样一个子系统,我们的 engine 中被称为 watchdog ,代码不过几百行。这块设计在 去年底的那次演讲 中也讲过了。不知道当时在场的朋友中有没有人关注。 :)

以上提到的诸点,并非在 big world 中全无。只是 engine 开发受制于人,又有些许沟通上的障碍。最终制约了我们自己的技术人员解决问题的粒度和速度。我想,若是欧美厂商购买了 big world ,能够用的更好吧。

现实是复杂的。没做到,没做好,并非我们的程序员不能也。


3 月 3 日补充:

这两天好几个天下组的同事找到我,给我讲这件事情的经过 :) 原来并不是排队系统没有做好。而是别的原因。(包括一些其它 bug ,服务器初期玩家过于拥挤在同一地点等)现在游戏服务器已经很流畅了。

Comments

为什么排队系统的代码我怎么找 都找不到```
不知道 云风大哥能不能分享一下啊` 小弟正在积极学习中....

很喜欢你的Blog! 我是梦幻西游的FANS,玩了已经有3年了,看了你写的关于随机数的问题,也有同感,在梦幻西游里面也有靠系统随机数投机的玩家.比如挖宝图时,会随机一个地方出现妖怪,而将出现妖怪的地方规定为大或者小,玩家都可以下注赌大小.(梦幻里面的MHB 1100万=100RMB 这个价格是国际通用兑换比例)这种现象会不会影响游戏的畸形发展?

身份认证系统分离。参考我以前写的 多服务器的用户身份认证方案 ,身份认证系统可以单独想办法做成集群,处理大量并发请求。但由于每通过一次身份认证只能拿到一次性令牌,这样就在身份认证系统和游戏系统之间做了一个缓冲层。
--------------
WOW应该就是这样搞的,帐号认证 角色读取是独立于游戏服务器的,即使在维护时,你也可以上线,只是找不到角色和服务器

大家一起加油吧!

祝你们天下的游戏做的出色.
然后祝你主持的项目能创造惊喜, 期待.

大家不用为这点事情争论了 :)

我写这篇 blog 不过借题发挥谈点技术方案而已。有兴趣的人自然能够从中多了解点想法。

不是啥新鲜东西,文中谈的东西,我在公开场合谈过。(指去年底在北京的那次会议)

公司内部,更早我就在至少在三个部门的技术交流会上做过专题讲座。如果外人看,会有误解,担心写这些东西会让我在我们内部造成不合,就是多虑了。

网易一贯的技术文化就是开诚布公,提倡积极交流。我想我们公司自己人是绝对不会认为我在这里放马后炮的 :) 因为公司内部的技术人员,大多订阅有内部技术交流的邮件列表,很多也听过我关于这个话题我的发言了。

如题说言,文章只是谈:排队系统应该如何做最好。

ps. 我最后补充的解释是说,问题不是由排队系统引起。事实上,现在的流畅,是因为其它问题解决了。系统流畅了,玩家根本用不着去排队了。

在系统不稳定的时候,排队系统若是做的好,跟其他部分隔离,是可以分担服务器负担的。而目前,天下的设计框架受制于 big world(big world 并没有实现排队) 。排队系统只能写在 big world 框架之内(排队模块并不能做到 first class ),这样的任务就完成不了。

Blog 中引出来的纠纷恐怕不在少数吧?ok,不在这个问题上关注过多,不过说我不明白个人 Blog 含义恐怕有些不妥,因为我本人也经常写。:)说的对不对得云风自己斟酌,旁人不必如此敏感。

少侠,你还没明白个人BLOG的含义。
有些属于自己的东西,不必那么累地对待。
何况,这是云风的个性。

多少东西,都因为很多非技术的原因没落了,在没有遇到问题的时候,你提出了意见,很多人根本就不理会的,说多了还容易被人骂。。。

有些人,说话严重了,,只不过随意说说事嘛,,他的同事也许都会看到的,,证明根本就无所谓拉

技术讨论完全不带个人之己私乃技术之本.有问题就拿出来叫大家都发表一下看法实乃正常之举.现在的拜金社会使得技术人对于非技术上的事考虑得越来越多,无怪乎.但是把它做为道理来说教别人未免太可笑乎.云风除却技术已然身之度外,请不要用己之心度大将之风度.

这篇我看是纯粹的技术讨论,文字也很客观,没有贬低同事的意思。

我觉得也是,13楼言重了

我个人觉得云风的BLOG能带给大家思考,而且带有鲜明的个性,所以大家喜欢看。如果顾忌太多,那就没什么题材可写了。这篇我看是纯粹的技术讨论,文字也很客观,没有贬低同事的意思。

一直看云风的 blog,这已经成为了我的习惯,同样是开发引擎,当孤独寂寞时从这个 blog 上总能找到一些继续下去的动力,从云风身上也能感到作为技术人员的钻研精神和难得的品质。奉承完了,下面开始批评:)1.首先我认为你不应该在 blog 上谈论当前公司正在测试中的游戏产品的技术缺陷(虽然你及时作了更正),这样会对公司的产品形象可能造成不利的影响,对公司的利益是一种损害。2.文章中提到了一些技术上的解决方案,为何不早些告之游戏开发团队,现在说似乎有些马后炮了(甚至还有些显示高明之嫌,不过我相信如果这么想就是小人度君子了)。3.对于问题的过于武断的判断,我相信每个人都会犯这个错误(前两天我在公司众人面前就犯了:)),如果是在公司内部说说到也无妨,但是如果写出来这个意义大不相同了,尤其是在许多人关注你的 blog 上。BigWorld 我没有用过,但也听说过一些关于这个引擎的评价。但毕竟是一款商业引擎,要指出其问题最好能给出科学准确的证据,至少在文章中我没有看到。因为你很诚实,所以我们在最后看到问题的原因并不是你之前的分析,同样因为你的诚实,所以我要诚实的说出我的意见。

领教了。
只要是研究得够深入每个行业都会有这样那样的技术难题,关键是我们如何对待这些问题的,是探究根源?还是勉强应付?
很是佩服云风的这种对技术的执着。

不过确实那时候你们的QC人员也登不上啊。还有,新手村问题,老大难吗?

不知道天下的排队系统在游戏中主要为了解决哪个瓶颈?
网络并发流量?还是玩家游戏数据计算能力?
对于udp的通信,在服务器端,保活报文也会给服务器带来很大的网络流量的浪费。

〉鄙视一下公司购买的某著名 php 写的论坛系统,居然默认不是用 utf-8 编码的。

各种php论坛,都有utf-8与GB两种版本下载,你下错版本了

我是个天下2的玩家,不过我只有在学校放假的时候才玩。寒假在家里时也有上去逛逛,只是听到天下2在29号再次出炉时会删号的消息后,就没什么心思再玩下去了。现在听到天下2登陆系统出了问题,感到挺悲哀的。为什么天下2就那么的命途多舛呢?毕竟这真的是一个挺不错的游戏,里面的故事,画面,都很唯美,适合中国人玩。哎,希望天下2好起来。

是Dz么?Dz有Utf8版本的啊?

下文改"引擎大多不成熟"

分析得不错, 引擎不大多成熟. 但尤其是BigWorld并不是一个很好的引擎, 如果是,他们自己应该有成熟的游戏作品来圈钱(网游可比卖引擎赚多了), 而不是兜售引擎.

John Remero 还是 John Romero ?

太精彩了!
真恨自己当初为什么没有选择游戏开发之路,我觉得这些方法才是程序最美之处!

呵呵 Dxxx 默认是gb2312

恩,学习了!

Post a comment

非这个主题相关的留言请到:留言本