geek的技术日志,记录每一次技术思考的闪光点。

解密珠三角游戏圈erlang江湖(Ejabberd搭建的游戏服务器后端)

作者:庆亮
作为算是第一批Erlang应用于webgame(说是始作俑者也不为过)的家伙,补充点当年的实际决策情况,顺便纠正几个错误的认识,也算是自黑了不少:

PS:
1. 以下内容都是实际在09-10年工作期间的真实情况,但是会尽量少八卦
2. 选择什么并不一定重要,做出选择才重要
3. 文中如果戳中某些人痛点请不要骂娘
4. 目前还在游戏行业,页游、手游领域都有涉及,Erlang也一路坚持了下来,大爱!
5. 没深入研究过Erlang的同学,请不要瞎评论了,负点责任好吗?搞得好像自己是个神,不管什么语言写两行就知道精髓了
6. 这不是个语言争论的回复,请勿讨论谁更好,但是欢迎讨论各个语言的优劣势以及如何扬长避短

  1. 页游07-09,草根的春天

国内页游从07年其实就有崛起之势,特别是“五分钟”团队推出“偷菜”之后,大众对游戏的态度慢慢开始改变,由抵制、打击变为合理的接受。 然而由于webgame门槛低、前期市场规模小、天生基于web,造成了早期的webgame很多都是基于PHP、Java、ASP这些在传统端游开发者看起来很不靠谱的编程语言(在珠三角以PHP最为主流),例如纵横天下、热血三国、商业大亨、弹弹堂、明朝时代等;顺便提下汉森的《倾城》,Java前后端,在当时的视觉效果真的很好,可惜内部出了问题,源码泄露、私服泛滥。

明朝时代截图:

09年我来到《明朝时代》团队时,觉得:我靠,太cool了,PHP居然能够写游戏!!! 居然!!!
===
呵呵,很多同学可能就会觉得“那是你没见识,游戏的技术早就成熟了,你居然还在佩服这种低级玩意”;对,当时的确是没有见识;但是更多的是当年作为一个新手(只有PHP自学的经验)对技术的渴望 — 技术追求的狂热是被不应该被语言所限制的,就像爱情不分种族。但是不少同学最觉得只有学习C++才是有追求的【不喜勿喷,你可能不是,但是你看看周围吧,多数的C++同学是这么思考的,等会我还会提个关于C++的八卦】。

这个时期页游的特点:技术门槛底、SLG横行、品质离端游差距巨大;由于这些原因,端游方面的人才基本都不愿意去搞页游,非常能够理解这样的想法,因为感觉起来是一种技术倒退;不过就市场来说,产品需求至上,技术是否先进不能代表一切【理性思考方式之一:不要用观点A的正确来证明B的错误】。

2. 09-10,我们遇到了问题,认识了Erlang,选择了Erlang

在2009年大概是8、9月的样子,我们看到一款游戏叫做《战斧》(2.5D即时战斗网页游戏《战斧OL》精美截图曝光),这是一款09年的基于Flash的网页ARPG,当时我们看到demo视频的时候以为是一款客户端(再次原谅我的浅薄,当时真的没有想到网页上可以做出来实时战斗游戏),当时的心情是:我靠,太cool了(=_=!),我们TMD还在搞什么鸟的SLG,技术太落后了!!!

2009年10月,《明朝时代》由于技术改进,引入了Ejabberd(erlang著名的开源聊天服务套件)作为游戏的聊天服务器,但是在使用过程中遇到了些技术问题,高潮来了:我们在不懂Erlang的情况下,尝试修改Ejabberd的源码,居然解决了我们的性能需求!当时我一方面佩服我当时的老大,一方面惊异于Erlang的神奇:要是C++端,有个10W行代码,你敢随便改吗?

2009年11月,ECUG在杭州召开,我们几个PHP都跑去膜拜各路大神,顺便请教一下他们在Erlang方面的看法。 期间结识了 @余锋 (不用介绍了吧) 立涛 @赵东炜 金尹 (这两位是《Erlang程序设计》的译者) @许式伟 (许总当年还没有找到golang) 老范(erlbattle – 恶狼战役->基于Erlang语言的实时技术学习平台[Erl Base actual time technic learnning env.]) 侯明园、李杰、崔博、Python大妈(一开始没认出来)一大批牛人以及周爱民老师。云风当时路过了下,没有机会深入请教。

这次技术会议应该是我目前为止收货最大的一次,当时听了余老大的PPT基本一遍就记住了(不是懂了),后来请教了以上诸位牛人的建议(当然主要还是余老大给的信心),各位也坦言用Erlang必然会遇到些问题,但是说实话,哪门子语言对于我们来说不会遇到问题呢?因此考虑了如下几点之后,我们选择了Erlang作为服务端语言:
a. Erlang的入门真的很简单(有同学说不简单,那我没办法)
b. 不懂C++,Java呢又觉得臃肿
c. PHP当时有团队验证搞ARPG不太适合(c扩展方式我们也搞不定)
d. 网页游戏当时“唯快不破”【当时的市场决定的】
e. 热更新对于在测试、技术能力上偏弱的一帮人来说,吸引力太大
f. 1:1模型对于编程复杂度的降低有非常直接的帮助【呵呵,麻烦没有实践过的同学不要瞎批评好吗?有时真的不太懂,你都没有搞过,怎么就敢理直气壮】
g. 天生分布式【谁用谁知道】

—–
根据 @bhuztez 的指正,用M:N的说法的确更合适,1:1其实是粒度的不同产生的说法,例如一个玩家一个网络进程,就是1:1,但是一个玩家一个进程就不合适了,这个时候可能是1:N了。

八卦一:技术会议本身是开放的,大家有意见讨论是正常的;ECUG杭州期间,Erlang主题的时候(忘记是哪位的主题了),两位C++同学一开始是各自向演讲者提问的,后来两位直接争起来了;随着接触C++同学越来越多,发现C++同学较为容易鄙视其他C++同学的做法,总是认为自己的做法才是符合C++的精髓;结果呢,高手本来就少,还很容易有鄙视链。 这个也是我对C++感觉心累的原因之一(我C++没学好,就不去评论C++本身了)。

3. 10年,踩坑、填坑Erlang

2010.1.1 我们团队4个人没有放假,过来公司写代码,因为实在太兴奋了—对于没有写过ARPG的人来说,这实在太让人激动了!
我们参考了RabbitMQ的代码结构和网络部分把框架搭建起来了,基本上是三天左右,这期间还一边在看书;使用了google protobuff作为通讯协议,顺便修正了部分protobuff第三库的一些bug,花了一周多时间;然后陆续花了2、3周的时间去做了几个简单功能,创建角色、登陆、场景、组队、怪物、战斗,我们把这个游戏demo称为mgee(mingchao game engine of erlang version,哈哈,好掉渣的英语,当时以为自己能搞个引擎,其实是无知者无畏),至于流传到了多少地方应该没法统计了,有几个三本学校开Erlang课程用的就是mgee作为基础。

到了2010.2月X号,我忘记了,反正后天就是年30了,mgee作为demo已经完成了使命,我们压测了一下发现只有500的承载能力,这个促使我们去了解跟多的游戏架构知识。

2010.3月,春节回来,我们团队到处找人请假,当时征途团队的技术负责人过来一次过广州,但是比较可惜没能有机会当面请教;后来呢,在网上找到一些资料,讲的是征途、天龙、魔兽世界等游戏的架构(有些是作者猜的),附上一些图给大家看下我们当年看到的资料:

天龙服务端架构思路:
bigworld:

QQ游戏大厅:

基于这样的资料和我们自己的经验,我们做了《明朝传奇》,在线最高到了3100。这期间我们搞明白了1:1该怎么用,mnesia该怎么用,哪些东西是Erlang可以搞得定的(除了怪物寻路,其他逻辑都是基于Erlang),最终明白了一个道理:用不用的好看你个人,语言的约束对群体有效,对个体不一定有效(类似统计与概率),我们从来不鼓吹别人去用Erlang(大家为什么用Erlang,我们只能算是开了头,不是鼓吹者),我们只是告诉你,用Erlang也可以用得好。

4. 2011-2012年,Erlang服务端框架简化

当时几个事情促使了我们再往前一步:
a. 明朝传奇的代码我们搞的太复杂,开发和运行效率都不够高,代码难以掌握
b. 当时光环的 @达达来讨论如何一机多服,给我们带来了思路上的很大冲击:成本控制
c. 顶端的Erlang不好培养

基于上面的原因,我们希望新的erlang服务端框架有如下特征:
a. 简单、简单到发指, @谢廷宝 当时大宝推荐了一种服务端设计的简单标准:有语言经验的人就能看得懂(并非100%掌握),也就是说看到API知道怎么写功能。 这里可能有人会吐槽了,你把框架搞的这么强,那些新人能学到什么? 呵呵,源码在内部是100%开放,每周都有内部分享来分析现有的实现的优缺点,每个人都可以在经过审查后修改核心实现,为什么会限制新人呢?总有些人讨论问题喜欢偷换概念,也喜欢指责别人自己做不到的事情。

b. 性能高,上面庞巍伟同学提到的2000在线是不对的,当时捷游的梦幻飞仙过了4700(不分线、回合);而我们的《仙落凡尘》则是不分线ARPG的情况下到了4300(4399 1服),就当时的CPU和内存使用情况来说,1/3的资源不到。(当时没有办法了,游戏地图设计的不够大,玩家进入游戏后实在太挤了)

在原则a的指导下,新人花三天看书、3天写点入门代码,1周的确是可以去写点简单的功能的。(在珠三角的同学欢迎当面来讨论验证)但是如果你要求1周就能多么熟悉、深入,这谁也做不到。

4. 2013-2015,Erlang在内部算是真正的落地

真要让一门技术变为解决方案,光靠坚持不够,我们在内部也做了一些事情来帮助Erlang在内部至少可以形成简单的生态群:
a. 成立虚拟的Erlang框架引擎组,负责在各个项目组之间同步优秀代码、统一基础框架、剥离业务抽象逻辑【由于这边的文化氛围,推进起来相对容易】
b. 剥离公用非游戏专用服务,例如mlog(通用日志服务)、mbd(通用大数据服务)、mchat(通用聊天监控服务)、mservice(通用托管服务),提供给各部门各项目使用

这样,配合少量开源库,基本上能够做到快速稳定高效,也不会那么容易遇到技术瓶颈,技术的应用方向也不会太狭隘。

5. 一点总结

a. 用了Erlang接近5年,越是深入越是觉得Erlang神奇,集中点还是Erlang的设计哲学,这里推荐一篇文章: Erlang的调度原理(译文)来了解下。
b. 我从c/php/erlang一路走过来,算是对编译型、脚本、函数式语言有个比较横向的了解,推荐时间较宽裕的同学深入学学Erlang,不一样的哲学会极大的丰富你的世界观,影响你的方法论(好吧,看起来有点鸡汤了)
c. 像分布式、热更新等都是非常重要的基础设施,真正的高手自然不需要,但是你是否需要这些还是可以判断的(多数人并非天才)
d. 感谢 @余锋 这样的人一直在坚持,总有人会让你觉得感动,感动于他们的坚持、分享,世界并非非黑即白,而是多姿多彩。Erlang、C++、C、PHP、Scala都是一部分。
e. 你或者你们团队用不用Erlang,要看你或者你们团队的经验、产品需要、职业发展、成本等来综合考虑,并不是一句话能够说明的清楚的。而我只是想说一般来说,坚持能解决大部分问题,没有多少所谓的弯路,Erlang和C++等语言谁好谁坏也不是一句话能定论的。

6. 其他补充

a. 当年的游戏服务端demo:qingliangcn/mgee · GitHub

 
************作者:猫粮**********
我来补充一下贺鹏的回答
广州页游公司招聘Erlang的其中一个重要原因就是因为他们手中有这么一套Erlang服务器引擎,传来传去都传到烂了,估计已经遍布珠三角了.据小道消息说神仙道也是用的Erlang服务器,他们的开发人员都搞得要疯掉了

但是为什么其他C++服务器(java)也有源码泄露,他们都不采用,而采用了基于Erlang的服务器呢?
那是因为Erlang简单易学,就连应届毕业生也能写,这个特别适合众小团队,随便拉个人过来,培训那么一两个星期,Erlang已经可以玩得很转了.要是基于C++的服务器,那一个新人上手到能实际贡献代码,那得等到猴年马月去了.

其次基于Erlang的服务器运维操作起来要相对简单,它本来就面向分布式的,有天生的优势在里面.

最后一点,也是我觉得最重要的一点,Erlang的代码可以热更新,在不需要重启服务器的情况下完成功能的更新. 小更新基本上是不需要停服的,涉及到数据结构更改之类的大更新才需要停服维护.例如要封杀一些外挂,不需要停机直接更新,直接所有服务器同步,这点很舒服.
我在开发Arpg服务器的过程中,逻辑从0开始,直到逻辑调试完成,期间经历过无数次的错误,但是服务器就算没有重启过,客户端也没有重启过,就一直在战斗界面里面把战斗的逻辑编写完成,节省了大量的开启和关闭的时间

 
*****************以下是踢馆*********
作者:庞巍伟

不请自来, 怒答一发

现在已经不做网页游戏了, 曾经做过一款3kw级别的页游, 当时在xx99公司, 项目刚立项的时候, 老板要求我用erlang做服务器, 说简单,容易上手, 不会出问题, 而我之前的开发经验基本都是3d客户端, 还给我一本erlang的书籍说让我好好研究下, 说研究完后可以找他要一套erlang的服务器端框架, 估计就是楼上说的传说中的框架, 可是我看完书后, 果断放弃了, 只是对他分布式的设计理念很感兴趣, 决定自己用c++ 和 lua 手动撸一套类似的东东出来, 在老板那边我任然说我用erlang, 其实我用的c++, 也没有找他要所谓的erlang框架.

项目快要上线的时候, 老板来问我, 用erlang有啥心得, 我答复”经过对比, 我还是使用了c++”, 老板有些发怒, 因为在老板手上死了n个c++服务器项目, 而且即便上线了还有若干问题, 比如宕机啊, 比如负载啊, 比如热更新啊, 比如跨服啊, 比如开发速度啊, 老板本身不懂技术, 他只知道他被c++程序员坑惨了, 只要听到用c++就不靠谱, 在他眼里能写好c++的程序员, 他认为在当时的xx99不超过5个, 显然这个时候他不认为我是那5个里的一个, 还有一点原因我猜是之前成功的项目没有用c++开发的.

老板忍住愤怒问我为什么, 我说, 我研究了erlang, 也了解了目前web game服务器开发需要的技术点, 上面提到的问题都可以解决, 同时表示, 服务器上线 单服 负载人数超过 之前所有游戏, 保证不宕机, 老板表示不屑, 因为之前估计他已经听过n个失败者对他这么讲了, 但事已至此, 老板只能抱着死马当活马医, 或者再被c++程序员坑一把的思想准备.

然后又经过一段时间开发, 经过2次压力测试, 项目付费首服上线, 顺利突破8k人同时在线, 没有宕机; 后来我才知道, 这2项数据轻松打破了xx99之前所有游戏的记录:

之前erlang的服务器,单服没有超过3k的, 一般1k-2k, 8k在线已经远远突破他们对页游的认知范围, 而8k的时候, 我扫了一眼服务器指标, 大概30%的cpu占用, 后来一机多服, 可以做到单机超过2w人在线;
之前的项目首服或多或少宕机(局部宕机), 或者拒绝服务, 首日很平稳的只此一款.
以上仅听说, 有误请指正.

通过这个项目之后, 我进入了公司的技术/职级评定委员会, 不定期会有一些技术答辩, 听了很多erlang项目技术实施过程中遇到的问题, 发现 erlang 的项目也不想之前想的那么简单, 关键的负载问题他们是绕不开的, 因为页游滚/导量服的特点, 导致单服2k左右的人数不仅仅技术原因, 也是业务需求, 所以当你问他们为服务器设计上不做到超过5k甚至更高技术指标是, 他们第一反应不是如何做到(我对技术的追求是, 不管业务需求如何, 技术开发中, 要做到效率最大化, 你想2k一个服那是业务需求, 但2k一个服不是我追求的技术指标), 而是业务没这个需求.

最后回答题主问题,为什么一些网页游戏喜欢用erlang做服务端?

  1. erlang有框架,能够满足页游业务的开发需求, 业务简单, 对技术指标要求不高;
  2. 找不到能够hold住c++的程序员, 同时之前经验让他们对c++开发怕了;
  3. 给不了高工资都请牛逼的程序员, 团队的构成普遍是一个高手带一群新人, 新手写c++都是坑, 失败率极高;
  4. erlang对跨服,分布式,热更新解决的比较好,同等的c++开发需要一定架构,技术要求比较高, 很多经验不足的程序员根本不知道c++能做到什么程度, 你让他们找个memory leak都只会打log, 写个aoi同步,只会9宫格同步, 可想而知;
  5. c++服务器一般c++代码的check out权限比较高, 带出去比较麻烦,erlang没有这个问题;
  6. 页游就那么几家公司, 前人用erlang,大家也跟着用, 带出erlang代码跳槽,继续用;
  7. 开发时间要求, 短平快, 不在乎技术积累.

我个人认为erlang仅适合业务密集型的开发,对于计算密集型的开发则比较困难, 需要c-node或者driver配合(这样还不如用c++呢),你用erlang开发个御龙在天服务器, 或者大量物理计算检查的服务器肯定不行.

以上仅针对我了解的一般c++开发人员, 高手请自觉绕过, 不要对号入座.

未经允许不得转载:极客技术 » 解密珠三角游戏圈erlang江湖(Ejabberd搭建的游戏服务器后端)

分享到:更多 ()

相关推荐

  • 暂无文章

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址