2011-05-29 131 views
2

假設您製作的是德州撲克遊戲服務器。我們有一個大廳和多個房間,其中有遊戲會議。你在什麼水平分開房間?node.js多人遊戲服務器架構

最初我以爲我會爲大廳中的每個房間產生一個節點實例。主要的好處是,如果遊戲崩潰,它肯定會孤立地進行。

當我意識到聊天服務器通常作爲管理多個房間的單個守護程序運行時,我對此方法失去了信心。在大廳的每個房間都需要一個單獨的監聽端口似乎很難看。我認爲跨房間管理身份也變得更容易 - 例如,如果玩家更改他們的名字。

有什麼想法? 「複用」單個節點服務器以管理多個遊戲室會話是否有意義?

+0

我將有一臺服務器管理所有的事情,個人。我會讓每個人進入一個路徑,比如/ rooms/123,然後用相同的代碼處理所有的請求。你打算如何計劃一場遊戲崩潰?這對你來說是什麼樣子?這是什麼? – jcolebrand 2011-05-29 08:09:20

回答

5

從技術上講,您無需聆聽每個房間的分隔端口。這是可能的,因爲操作系統支持父項&子進程共享相同的套接字(文件)描述符。您可以使用WebWorker節點模塊來實現此目的。通過這種體系結構,您可以自動獲得負載平衡模塊,該模塊可以使用OS進程調度程序將傳入連接分配到不同的子進程。

但是,在您的系統中,最難的部分是如何在這些進程之間共享公共數據,因爲它們擁有自己的內存空間。幸運的是,有一些方法可以共享這些數據(在線會話,房間,分數表......),但它們可能相當複雜。一種方法是讓子進程通過IPC(套接字)與主進行通信,另一種方式是使用每個人都可以即時訪問的共享內存區(數據庫,memcached ...)。

我建議您先使用單節點流程架構來構建您的系統(如果您打算使用websocket,您可以處理大量併發連接),那麼當您需要擴展系統時,請使用webworker體系結構。此外,如果您已經使用普通的地方來存儲/檢索數據(數據庫,memcached,redis密鑰庫......),則遷移時間不會很長。

0

我會爲您的應用推薦Hook.io。它是讓多節點進程通過事件進行通信的框架。