Jason Pearlman談《Draw Something》后臺技術發展
來源:http://gamerboom.com/archives/51668
作者:Jason Pearlman
我至今已在OMGPOP工作了將近4年,見證著它從最初的約會網站轉變為游戲公司,并最終扎根于手機游戲的整個發展過程。而在這期間我們也經歷了各種挑戰,并嘗試了各種不同的技術和運營計劃。
我一直覺得我們是個小型團隊,可以利用快速原型,敏捷開發以及其它最新技術以獲得優勢。同時,身處于游戲領域我們還需要盡可能地嘗試各種不同的理念,以判斷哪些才真正合適。在這幾年時間里,我創造了虛擬角色系統,文本冒險游戲引擎,全功能的共享數據庫系統,基于我們的javascript游戲引擎的多人即時平臺游戲,AIM bot系統,以及基于我們所創造的bot框架而創造起來的具有各種聊天功能的游戲等。
但是所有這些游戲的后臺系統卻是由一個很小的系統團隊所支撐,這個團隊中只有三名成員,包括Christopher Holt,Manchul Park以及我自己。我們都是白手起家地創造所有內容,并始終堅信我們能夠有效地創建并靈活調整游戲的后臺系統。直到《Draw Something》的出現。
draw_something(from idownloadblog.com)
回顧之前
早在4年前我們便在自己的網站OMGPOP.com(游戲邦注:后來改為iminlikewithyou.com)上推出了《Draw Something》的雛形,那時候叫做《Draw My Thing》,是一款即時繪畫游戲。這是一款有趣的游戲,并且擁有較多的玩家基礎(主要是受益于我們網站當時不錯的發展)。我們同時也創造了這款游戲的Facebook版本,并吸引了許多忠實玩家。
去年,我們決定創建這款游戲的手機版本。但是與此同時,OMGPOP也仍然在不斷探索著最適合自己的發展方向。我們一直致力于創造出一款真正熱門的游戲。并且與大多數開發者一樣,這就意味著我們需要盡可能創造出更多游戲。即使是面對《Draw Something》也不例外。我們知道這是一款具有潛力的游戲,但是卻沒人能夠預見它最終的發展。從技術角度來看,我們并未區別對待這款游戲。所以我們的后臺團隊始終致力于快速而高效地為這些游戲提供技術支持。
我們已經學會了如何簡單做事。最初《Draw Something》的后臺被設計為擁有版本控制的簡單key/value儲存模式。我們將服務嵌入現有的ruby API(使用merb框架以及thin網絡服務器)。我們的最初理念是將之前所創造的所有內容用于現有的API中,并為《Draw Something》編寫一些新的key/value內容。因為我們是根據比例進行設計,所以我們一開始便選擇Amazon S3作為我們所有key/value數據的儲存庫。而采取這一做法的初衷便是放棄一些等待時間并獲得無限量的可擴展性和儲存空間。
并且我們之后所添加的各種內容都是以標準化模式進行。任何想要建造一個可擴展系統的人都必須想辦法讓每個系統規模的層面能夠獨立于其它層面。我們將NGINX網絡服務器(它指向HAProxy軟件負載均衡器)作為前臺網絡,它隨后將打開我們運行于thin網絡服務器中的ruby API。而MySQL便是我們此時的主要數據儲存處。我們將大量使用緩存系統以及redis進行異步排列,并使用ruby庫存調用resque。
飛速發展
在《Draw Something》發行后幾天我們開始注意到一個非常奇特的現象。這款游戲正在快速發展著。發布當天它便取得了3萬次的下載量;而在發布10天后,其下載量更是飆升至七位數。
各種名人開始在twitter上談論這款游戲——包括John Mayer(游戲邦注:美國創作歌手)和Pauly D,更是為我們的游戲創造了更多的流量。之前的玩家也未離開游戲,他們深深陷入游戲的樂趣中,游戲的總體使用率甚至遠遠高于它每天的下載量。
大多數工程師都是根據比例去開發軟件,但是要知道,在任何復雜的系統中即使你嘗試著為其設下基準并進行測試,你也很難判斷哪些內容會以何種方式遭遇失敗,以及你需要在何時修改何種系統等。
解決問題
我們所遇到的第一個問題便是我們平常所使用的API速度過快,這就意味著我們只能以平常的方法(即單線程,一次只執行一次請求)去使用thin網絡服務器,而對于公共云服務,我們卻不知道有多少時間能夠用于內容備份。
雖然我們看到一些內容開始備份,但是這一方法卻并非長久有效。同時我們也通過不斷地創造出更多服務器而節約時間。幸運的是,我們以此設計出了DrawSomething API,并且將其區別于我們主要的API以及框架。我們總是對一些新技術充滿好奇,就像此時的我們正研究著Ruby 1.9極其纖程(fiber)以及Event Machine + synchrony。并且為了能夠更快解決問題,我們選擇了Goliath——來自PostRank的一款非阻塞型ruby應用服務器。在接下來的24小時內我得把key/value代碼以及其它支持庫存移植到了這個服務器上,并編寫一些測試然后激活這一服務。結果正如預想的那樣,我們成功地將6個服務器中的115個應用實例分解為只剩下15個應用實例。
但是這種一帆風順的局面卻是短暫的。一些問題開始慢慢浮出水面。這時候我們真的是晝夜不停地工作著,并且在某天的凌晨1點發現了主要問題所在,即我們的云數據儲存在這時候發生了90%的請求錯誤。這之后,我們立刻接收到了來自運營商的郵件,告知我們因為服務器運行達到極限才導致這一問題出現,所以他們不得不開始限制游戲的運行速度。
這時候,服務對我們來說就猶如黑盒子一樣,而我們需要努力獲得更多控制權。此于我們每秒鐘大約可以接收到30幅畫,而這對于當時的我們來說真的是個大數目了。所以我們便需要一個全新的后臺以規劃并處理我們現在的流量。我們曾經在一些小系統中使用過Membase,并認為它能夠有效地應用于這款游戲中,所以我們便決定采取這種行動。
我們開始使用Membase(也就是Couchbase)的一個小cluster并重新編寫了整款應用,并在當天凌晨3點時激活它。我們的云數據儲存問題立刻得到了緩解——盡管我們仍然在使用它將數據到移植新的Couchbase中。通過這種優化,我們的游戲便能夠持續有效地向前發展了。
接下來一周對于我們來說也是困難重重,因為其它一些隨機的數據儲存問題也不斷涌現,而與此同時我們還需要去規劃其它基礎設施部分。這時候,我們需要更加勤奮地投入研究中,并咨詢其他能夠幫助我們處理這種爆炸式發展的人士。
我曾經與10多個非常聰明且出色的人士進行交談,包括來自Hunch的Tom Pinckney及其優秀的團隊,SocialFlow的Frank Speiser及其團隊,Tumblr的Fredrik Nylander,Fastly的Artur Bergman,以及之前在Twitter上遇到的Michael Abbot等。有趣的是盡管我提出了相同的問題,即他們會如何處理這類型的挑戰,他們卻給予了我各種不同的答案。從而讓我們意識到其實我們自己的答案與那些我們所尊敬的團隊的答案同樣都是有效的。所以我們便繼續朝著一開始所設定好的道路前進,并不斷思考我們該選擇何種技術以及如何執行它們。
盡管使用Couchbase為我們帶來了一系列問題,但是我們都認為從當前的基礎設施徹底轉移到完全不同的平臺風險更大。而此時的《Draw Something》每天能夠吸引300萬至400萬玩家。我們聯系了Couchbase并獲得了一些建議,也就是擴展我們的cluster,利用SSD硬盤驅動器和大量的RAM強化我們的服務器。我們的確這么做了,也就是創造出更多cluster,并基于可擴展內容而進一步分解它們。并且隨著流量的不斷攀升,我們也持續完善并規劃著游戲的后臺服務器。現在我們平均每秒鐘可以接收上百張畫了。
隨著游戲的迅速發展,我們的玩家每天也在迅速翻倍增長。而這時候我們需要面對的情況便是如果用戶每天成倍增長著,我們的服務器也必須每天翻倍發展。幸好我們的系統高度自動化,而我們也不斷創造出更多服務器,使服務器最終能夠趕上游戲的發展速度,讓游戲能夠在100個服務器之間有序地運行著。但是這個問題解決了,前面又出現了另一個瓶頸。
我們做好了要連續大干60多個小時的準備,并且在此期間都不打算離開電腦了。我們必須使用DNS負載均衡器擴展網絡服務器,我們必須完成獲得更多HAProxies等急迫任務,并且通常都要在深夜落實行動。
非常幸運的是我們的大多數層面都是可擴展的并且不需要做出過多的修改。我們的定制服務器監控工具一直在幫助追蹤游戲的加載,儲存甚至是游戲的即時用戶屬性,以幫助我們更好地進行容量規劃。最終,我們輕松地推出了應用的cluster,并包含了NGINX,HAProxy以及Goliath服務器(相互獨立),并且在上線后它們能夠以一種恒速幫助我們提高容量。現在,我們每秒鐘便能夠接收上千張畫了,而一周前看似巨大的流量換做現在也已經變得非常渺小了。

draw something elvi(from gamasutra)
展望未來
OMGPOP所有員工都非常支持我們現在的工作,并且也清楚我們現在所做的事情對于公司發展的重要性。也就是我們得到了公司內部的絕對認可。
難得有游戲能夠在如此短的時間內便創造出如此顯赫的成績,也難得有人會為游戲的發展付出如此高的代價。直至今日,《Draw Something》在50天內便創造出了超過5000萬次下載量。在最高峰時游戲服務器甚至每秒能夠收到大約3千幅畫。看到游戲取得的巨大成功,我們能夠自豪地說,雖然還存在一些粗糙的修補程序,但是我們有信心保持這款游戲的有效運行。如果這款游戲失敗了,我們也不可能迎來如此巨大的發展。
本周我們在《Draw Something》中又添加了一些新的功能,如評論和保存功能——這也是玩家所希望的。
現在,我們已經成為Zynga中的一份子(也就是Zynga Mobile New York),我們能夠更加專注于《Draw Something》的完善——而我們也仍然保持著OMGPOP的企業文化。現在,我們甚至計劃將該游戲轉移到Zynga的zCloud基礎設施(游戲邦注:能夠有效地協調并處理社交游戲中的工作負荷)。
回首過去幾周的發展,我們真的很難想象自己可以從一家原本只有幾個員工的小公司而成為Zynga的一份字,并接觸到更多專業人士和技術。
可以說,我們終于實現了目標而創造出一款真正熱門的游戲。盡管我們遭到了各種挫折,并且也有所延遲,但是我們最終還是創造出一個真正有效的后臺去發展我們的這款游戲。