pomelo - 網易開源基于Node.js的游戲服務器框架
最近,網易在 Github 上開源了基于 Node.js 的游戲服務器框架——pomelo。它包括基礎的開發框架和相關的擴展組件(庫和工具包),可以幫助開發人員省去游戲開發枯燥中的重復勞動和底層邏輯的開發。 pomelo 不但適用于游戲服務器開發, 也可用于開發高實時 Web 應用。
pomelo 框架包括三部分:
- 框架, pomelo 的核心, 與以往單進程的游戲框架不同, 它是高性能、分布式的游戲服務器框架,并且使用很簡單。
- 庫, 包括了開發游戲的常用工具庫, 如人工智能(ai)、尋路、aoi 等。
- 工具包, 包括管理控制臺、 命令行工具、壓力測試工具等。 </ul>
- 快速、易上手的游戲開發模型和 API。
- 高可伸縮的多進程架構, 支持 MMO 的場景分區和其它各類分區策略。
- 方便的服務器擴展機制,可快速擴展服務器類型和數量。
- 方便的請求、響應、廣播、服務器通訊機制, 無需任何配置。
- 注重性能,在性能、可伸縮性上做了大量的測試、優化。
- 提供了較多擴展組件,包括游戲開發常用的庫和工具包。
- 提供了完整的 MMO demo 代碼(客戶端 html5),可以作為很好的開發參考。
- 基于 socket.io 開發,支持 socket.io 支持的多種語言客戶端。 </ul>
- 架構的可伸縮性好。 采用多進程單線程的運行架構,擴展服務器非常方便, Node.js 的網絡 IO 優勢提供了高可伸縮性。
- 使用非常容易, 開發模型與 Web 應用的開發類似,基于 convention over configuration 的理念, 幾乎零配置, API 的設計也很精簡, 很容易上手。
- 框架的松耦合和可擴展性好, 遵循 Node.js 微模塊的原則, framework 本身只有很少的代碼,所有 component、庫、工具都可以用 npm module 的形式擴展進來。任何第三方都可以根據自己的需要開發自定義 module。
- 提供完整的開源 MMO 游戲 demo 參考(基于 HTML 5)。 一個超過 1 萬行代碼的游戲 demo,使開發者可以隨時借鑒 demo 的設計與開發思路。 </ul>
- io 與可伸縮性的優勢。io 密集型的應用采用 Node.js 是最合適的, 可達到最好的可伸縮性。
- 多進程單線程的應用架構。Node.js 天生采用單線程, 使它在處理復雜邏輯的時候無需考慮線程同步、鎖、死鎖等一系列問題, 減少了很多邏輯錯誤。 由多進程 Node.js 組成的服務器群是最理想的應用架構。
- 語言優勢。使用 javascript 開發可以實現快速迭代,如果客戶端使用 HTML 5,更可實現代碼共用。 </ul>
- 長連接與短連接。web 應用使用基于 http 的短連接以達到最大的可擴展性,游戲應用采用基于 socket (websocket)的長連接,以達到最大的實時性。
- 分區策略不同。web 應用的分區可以根據負載均衡自由決定, 而游戲則是基于場景(area)的分區模式, 這使同場景的玩家跑在一個進程內,以達到最少的跨進程調用。
- 有狀態和無狀態。web 應用是無狀態的, 可以達到無限的擴展。 而游戲應用則是有狀態的, 由于基于場景的分區策略,它的請求必須路由到指定的服務器, 這也使游戲達不到 web 應用同樣的可擴展性。
- 廣播模式和 request/response 模式。web 應用采用了基于 request/response 的請求響應模式。而游戲應用則更頻繁地使用廣播,由于玩家在游戲里的行動要實時地通知場景中的其它玩家, 必須通過廣播的模式實時發送。這也使游戲在網絡通信上的要求高于 web 應用。 </ul>
- server management, pomelo 是個真正多進程、分布式的游戲服務器。因此各游戲 server (進程)的管理是 pomelo 很重要的部分,框架通過抽象使服務器的管理非常容易。
- network, 請求、響應、廣播、RPC、session 管理等構成了整個游戲框架的脈絡,所有游戲流程都構建在這個脈絡上。
- application, 應用的定義、component 管理,上下文配置, 這些使 pomelo framework 的對外接口很簡單,并且具有松耦合、可插拔架構。 </ul>
- 服務器(進程)的抽象與擴展:在 web 應用中, 每個服務器是無狀態、對等的, 開發者無需通過框架或容器來管理服務器。但游戲應用不同, 游戲可能需要包含多種不同類型的服務器,每類服務器在數量上也可能有不同的需求。這就需要框架對服務器進行抽象和解耦,支持服務器類型和數量上的擴展。
- 客戶端的請求、響應、廣播:客戶端的請求、響應與 web 應用是類似的, 但框架是基于長連接的, 實現模式與 http 請求有一定差別。廣播是游戲服務器最頻繁的操作, 需要方便的 API, 并且在性能上達到極致。
- 服務器間的通訊、調用:盡管框架盡量避免跨進程調用,但進程間的通訊是不可避免的, 因此需要一個方便好用的 RPC 框架來支撐。
- 松耦合、可插拔的應用架構:應用的擴展性很重要, pomelo framework 支持以 component 的形式插入任何第三方組件, 也支持加入自定義的路由規則、 自定義的 filter 等。 </ul>
pomelo 的主要特性:
網易 pomelo 開發團隊在項目主頁上列舉了推薦 pomelo 的理由:
高并發、高實時的游戲服務器的開發是很復雜的工作。跟 Web 應用一樣,一個好的開源容器或開發框架可以大大減少游戲開發的復雜性,讓開發變得更加容易。遺憾的是目前在游戲服務器開發領域一直沒有太好的開源解決方 案。 pomelo 將填補這個空白, 打造一款完全開源的高性能(并發)游戲服務器框架。
</blockquote>pomelo 的優勢有以下幾點:
pomelo 為什么采用 Node.js 開發?
Node.js 自身特點與游戲服務器的特性驚人的吻合。 在 Node.js 的官方定義中, fast、scalable、realtime、network 這幾個特性都非常符合游戲服務器的要求。游戲服務器是個網絡密集型的應用,對實時性要求極高,而 Node.js 在網絡 io 上的優勢也完全可以滿足這點。使用 Node.js 開發游戲服務器的優勢總結:
網易 pomelo 開發團隊介紹了游戲服務器的運行架構:
一個真正高可擴展的游戲運行架構必須是多進程的。Google 的 gritsgame,、Mozilla 的 browserquest 都采用了 Node.js 作為游戲服務器開發語言, 但它們都采用了單進程的 Node.js 服務器,缺乏擴展性,這使它們可以支撐的在線用戶數量是很有限的(這兩個游戲主要是作為 HTML5 游戲的 demo)。而多進程的架構可以很好的實現游戲服務器的的擴展性,達到支撐較多在線用戶、降低服務器壓力等要求。
</blockquote>該游戲運行架構表面上看與 web 應用運行架構很類似,connector 類似于 web 應用的 apache/nginx 等 web 服務器,后端的服務器群類似于 web 應用中的應用服務器(如 tomcat),但實際上存在著很大的差別:
pomelo framework 的組成架構如圖所示:
圖片來源: Github 網易 pomelo 項目介紹
pomelo 的架構設計目標:
感興趣的讀者可以訪問 Github 網易 pomelo 項目主頁了解更多詳情。
來自: InfoQ本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!