vlambda博客
学习文章列表

为什么一些游戏喜欢用Erlang做服务端?

作为算是第一批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前后端,在当时的视觉效果真的很好,可惜内部出了问题,源码泄露、私服泛滥。

明朝时代截图:


为什么一些游戏喜欢用Erlang做服务端?



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,技术太落后了!!!



为什么一些游戏喜欢用Erlang做服务端?



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

天龙服务端架构思路:


为什么一些游戏喜欢用Erlang做服务端?

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


来源:知乎