@龐巍偉@貓糧 等同學的回答基本上都是點中關鍵點了,但是部分內容需要糾正下。
作為算是第一批Erlang應用于webgame(說是始作俑者也不為過)的家伙,補充點當年的實際決策情況,順便糾正幾個錯誤的認識,也算是自黑了不少:
PS:
1. 以下內容都是實際在09-10年工作期間的真實情況,但是會盡量少八卦
2.
選擇什么并不一定重要,做出選擇才重要3. 文中如果戳中某些人痛點請不要罵娘
4. 目前還在游戲行業,頁游、手游領域都有涉及,Erlang也一路堅持了下來,大愛!
5. 沒深入研究過Erlang的同學,請不要瞎評論了,負點責任好嗎?搞得好像自己是個神,不管什么語言寫兩行就知道精髓了
6. 這不是個語言爭論的回復,請勿討論誰更好,但是歡迎討論各個語言的優劣勢以及如何揚長避短
- 頁游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年,踩坑、填坑Erlang2010.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