为什么一些网页游戏喜欢用Erlang做服务端？
等同学的回答基本上都是点中关键点了，但是部分内容需要纠正下。 作为算是第一批Erlang应用于webgame(说是始作俑者也不为过)的家伙，补充点当年的实际决策情况，顺便纠正几个错误的认识，也算是自黑了不少： PS： 1. 以下内容都是实际在09-10年工作期间的真实情况，但是会尽量少八卦 2. 选择什么并不一定重要，做出选择才重要 3. 文中如果戳中某些人痛点请不要骂娘 4. 目前还在游戏行业，页游、手游领域都有涉及，Erlang也一路坚持了下来，大爱！ 5. 没深入研究过Erlang的同学，请不要瞎评论了，负点责任好吗？搞得好像自己是个神，不管什么语言写两行就知道精髓了 6. 这不是个语言争论的回复，请勿讨论谁更好，但是欢迎讨论各个语言的优劣势以及如何扬长避短 国内页游从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月的样子，我们看到一款游戏叫做《战斧》( )，这是一款09年的基于Flash的网页ARPG，当时我们看到demo视频的时候以为是一款客户端(再次原谅我的浅薄，当时真的没有想到网页上可以做出来实时战斗游戏)，当时的心情是：我靠，太cool了(=_=!)，我们TMD还在搞什么鸟的SLG，技术太落后了！！！ 2009年10月，《明朝时代》由于技术改进，引入了Ejabberd(erlang著名的开源聊天服务套件)作为游戏的聊天服务器，但是在使用过程中遇到了些技术问题，高潮来了：我们在不懂Erlang的情况下，尝试修改Ejabberd的源码，居然解决了我们的性能需求！当时我一方面佩服我当时的老大，一方面惊异于Erlang的神奇：要是C++端，有个10W行代码，你敢随便改吗？ 2009年11月，ECUG在杭州召开，我们几个PHP都跑去膜拜各路大神，顺便请教一下他们在Erlang方面的看法。 期间结识了 (不用介绍了吧)  立涛 金尹 (这两位是《Erlang程序设计》的译者) (许总当年还没有找到golang) 老范( ) 侯明园、李杰、崔博、Python大妈(一开始没认出来)一大批牛人以及周爱民老师。云风当时路过了下，没有机会深入请教。 这次技术会议应该是我目前为止收货最大的一次，当时听了余老大的PPT基本一遍就记住了（不是懂了），后来请教了以上诸位牛人的建议（当然主要还是余老大给的信心），各位也坦言用Erlang必然会遇到些问题，但是说实话，哪门子语言对于我们来说不会遇到问题呢？因此考虑了如下几点之后，我们选择了Erlang作为服务端语言： a. Erlang的入门真的很简单(有同学说不简单，那我没办法) b. 不懂C++，Java呢又觉得臃肿 c. PHP当时有团队验证搞ARPG不太适合(c扩展方式我们也搞不定) d. 网页游戏当时“唯快不破”【当时的市场决定的】 e. 热更新对于在测试、技术能力上偏弱的一帮人来说，吸引力太大 f. 1:1模型对于编程复杂度的降低有非常直接的帮助【呵呵，麻烦没有实践过的同学不要瞎批评好吗？有时真的不太懂，你都没有搞过，怎么就敢理直气壮】 g. 天生分布式【谁用谁知道】 ----- 根据 的指正，用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的设计哲学，这里推荐一篇文章： 来了解下。 b. 我从c/php/erlang一路走过来，算是对编译型、脚本、函数式语言有个比较横向的了解，推荐时间较宽裕的同学深入学学Erlang，不一样的哲学会极大的丰富你的世界观，影响你的方法论（好吧，看起来有点鸡汤了） c. 像分布式、热更新等都是非常重要的基础设施，真正的高手自然不需要，但是你是否需要这些还是可以判断的（多数人并非天才） d. 感谢 这样的人一直在坚持，总有人会让你觉得感动，感动于他们的坚持、分享，世界并非非黑即白，而是多姿多彩。Erlang、C++、C、PHP、Scala都是一部分。 e. 你或者你们团队用不用Erlang，要看你或者你们团队的经验、产品需要、职业发展、成本等来综合考虑，并不是一句话能够说明的清楚的。而我只是想说一般来说，坚持能解决大部分问题，没有多少所谓的弯路，Erlang和C++等语言谁好谁坏也不是一句话能定论的。 6. 其他补充 a. 当年的游戏服务端demo：