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