專訪網(wǎng)易謝騁超 探秘游戲類服務(wù)器架構(gòu)
原創(chuàng)【51CTO專訪】北京時間2012年12月4日 Velocity China 2012 Web性能與運維大會在北京召開,在會中51CTO記者有幸采訪到了網(wǎng)易pomelo開源游戲框架負責人謝騁超。在本次Velocity上謝騁超為大家分享的話題是《構(gòu)建快速、可擴展node.js游戲服務(wù)器》。下面是51CTO對謝騁超的采訪實錄。
謝騁超 網(wǎng)易杭州研究高級程序?qū)<?微博: @圈圈套圈圈 twitter: @xiecc PPT下載請點擊這里
謝騁超 2006年浙江大學(xué)碩士畢業(yè)后加入網(wǎng)易,參與過網(wǎng)易博客開發(fā),主持過博客圈子,及開放平臺等開發(fā),2年前轉(zhuǎn)向游戲開發(fā)領(lǐng)域。 專注于服務(wù)端開發(fā)技術(shù),對高性能高并發(fā)網(wǎng)站(游戲)的架構(gòu)設(shè)計、調(diào)優(yōu)有較豐富經(jīng)驗。 對node.js與java開發(fā)有豐富的經(jīng)驗。目前是pomelo開源游戲框架負責人。
游戲服務(wù)器架構(gòu)與其他類型的服務(wù)器架構(gòu)有哪些不同?在穩(wěn)定性、擴展性以及安全性上有哪些不同?
謝騁超:相比web服務(wù)器的無限擴展能力, 游戲服務(wù)器在可伸縮性上要受到很多限制。 主要包括以下幾點:
一、長連接與基于request/response的短連接模式。由于實時性要求(100ms返回響應(yīng)),所有的實時游戲(或?qū)崟rweb應(yīng)用)都需要這種長連接模式, 它占用的資源必然比短連接模式多。
二、分區(qū)模式不同。由于游戲中玩家交互的相鄰性, 游戲的分區(qū)模式是基于場景的分區(qū)。 這種分區(qū)模式可使相鄰?fù)婕业慕换ゴ鷥r最少,但這種分區(qū)是有狀態(tài)的,可擴展性也必然受到影響。
三、大量的實時廣播。游戲中有大量其它玩家或怪物的動態(tài)需要實時廣播給玩家, 廣播的代價是指數(shù)增長的,如果玩家數(shù)量達到1,000,如果每個人都要看到其它玩家的變化,則廣播將需要消耗 1,000,000次傳送。 因此必須要想出一些策略來減少廣播的代價, 利用AOI(Area of Interested)和分進程等策略能減少一部分代價。
四、服務(wù)端的實時tick。實時游戲一般都會在服務(wù)端每隔一段時間(如100ms)跳一下, 這就決定了每個tick所消耗的時間要遠遠少于100ms, 這對于場景中的實體和邏輯也有很大的限制。
穩(wěn)定性: 由于分區(qū)的有狀態(tài)性, 決定了游戲服務(wù)器中某個場景服務(wù)器掛了以后不能實時切到其它服務(wù)器。當然也可以通過備份進程的方法來解決, 但這會大量增加服務(wù)器的通訊和運行代價。幸好一般的游戲服務(wù)器組不是太大。
安全性: 游戲服務(wù)器的安全性設(shè)計原則是只相信服務(wù)端的數(shù)據(jù),所有客戶端發(fā)過來的請求都需要校驗, 如果客戶端數(shù)據(jù)與服務(wù)端數(shù)據(jù)有沖突, 則只相信服務(wù)端的數(shù)據(jù)。這點跟web開發(fā)有點類似,但校驗邏輯更復(fù)雜。
pomelo框架在以上各方面都進行了深入的考慮和實踐, 并提供了完整的解決方案。
在設(shè)計游戲的服務(wù)器架構(gòu)時思考的重點應(yīng)該放在哪些地方呢?
謝騁超:設(shè)計游戲服務(wù)器架構(gòu)重要點思考的重點有以下幾個地方:
一、可伸縮性。這個在前面都提到了。更詳細的信息可以看pomelo的文檔:https://github.com/NetEase/pomelo/wiki/pomelo架構(gòu)概覽
二、可擴展性??蓴U展的架構(gòu)很重要, 不僅包括應(yīng)用的擴展點,組件的可替換性, 還有服務(wù)器擴展。pomelo實現(xiàn)了獨一無二的服務(wù)器擴展機制,非常簡單、非常的輕量級。
三、性能。性能毫無疑問是所有服務(wù)器框架都要重點考慮的, 尤其是游戲服務(wù)器要求的響應(yīng)時間一般是100ms, 遠遠比普通web應(yīng)用低。因此在數(shù)據(jù)的傳輸, 數(shù)據(jù)量,服務(wù)端的處理等方面都要深入考慮, 并且需要做完整深入的壓力測試。
之前看過暴雪出售的退役服務(wù)器,游戲服務(wù)器就意味著更高的硬件么?設(shè)計游戲架構(gòu)與采用游戲架構(gòu)的時候需要怎樣看待硬件的使用問題。
謝騁超:不一定,現(xiàn)在主流的web服務(wù)器配置已經(jīng)非常好了,足夠支撐普通游戲服務(wù)器的需求。尤其是使用pomelo框架開發(fā)的游戲服務(wù)器非常的輕量級, 占用的資源非常低。
很多移動、網(wǎng)頁、社交游戲的服務(wù)端都是跑在云平臺上的, 虛擬機的性能已經(jīng)足夠支撐這些需求。當然大型MMO RPG對硬件的需求要高一些,有一些計算很耗CPU, 一般一組服務(wù)器要跑在幾臺配置較好的刀片上。
附:pomelo框架的壓力測試
您是怎么看node.js與Lua語言的呢?兩者之間的區(qū)別與相同之處。
謝騁超:Lua在是游戲開發(fā)領(lǐng)域非常常見的輕量級嵌入式語言, node.js則是最近非常火的服務(wù)端異步IO語言。兩者有一些很類似的特性, 如垃圾收集、單線程、函數(shù)式編程、高效的實現(xiàn)。
Node.js獨一無二的優(yōu)勢是它在IO上的優(yōu)勢, 由于網(wǎng)絡(luò)游戲是網(wǎng)絡(luò)密集型的,這使node.js的可伸縮很強。另外,從跨語言開發(fā)和社區(qū)支持的角度來看,Javascript有更大的優(yōu)勢。由于很多客戶端也是用js開發(fā)(如html5 , unity 3d), 同種語言會帶來很大開發(fā)上的便利性。
Lua天生就是作為一個極其輕量、可嵌入的設(shè)計實現(xiàn),它更適合做API的封裝或是數(shù)據(jù)傳輸?shù)闹虚g層,假如需要跨設(shè)備邊界,并在不同語言環(huán)境中進行移植,Javascript是個更好的選擇,而且Javascript似乎已經(jīng)證明了具有構(gòu)建大規(guī)模復(fù)雜程序的能力。因此 , 如果是開發(fā)web、移動或社交游戲,毫無疑問node.js的優(yōu)勢更大。Lua則更適合做大型MMO RPG中的嵌入式腳本語言。