2014-03-07 36 views
3

我有一個運行在節點後端的實時HTML5畫布遊戲。玩家通過Websocket(socket.io)連接。問題是有時我需要部署新的代碼(比如修補程序)並重新啓動服務器,但我不想斷開連接。如何分離實時遊戲架構

我的想法是將websocket服務器和應用程序服務器劃分爲可單獨部署的組件,並在中間添加消息隊列以將這兩個組件解耦。這樣,如果應用程序服務器重新啓動,那麼只有短暫的延遲,而消息聚集在一起,但沒有任何東西會丟失。這是一個好策略嗎?有其他選擇嗎?

+0

你不需要如此解耦:如果您只是讓隊列持久化(或者如果解耦它),則只需在斷開連接並詢問狀態時使瀏覽器重新連接即可。 –

+0

不應在活動服務器上部署imho修補程序,如果修補程序打破其他一些行爲,該怎麼辦?在計劃好修補程序的正面行爲將其合併到生產之後,將開發服務器放到您想要的所有內容上是一個不錯的主意。玩家可以耐心等待5分鐘的停機時間,但如果生產更新需要更多時間,最終你會失去它們。 – Gntem

+1

你給予賞金的事實,但不回覆評論或答案,如果你不在乎是令人不安的。你在期待什麼? –

回答

3

基於websocket的應用程序很有可能在沒有用戶注意的情況下重新啓動(my chat server for example就是這種情況)。

爲了做到這一點,解決方案是不要將websocket應用程序隔離並且不要重新啓動。事實上,這將是非常樂觀的(你確定你可以確保它的API永不改變?)。

一種解決方案是

  1. ,以確保如果斷開客戶端重新連接
  2. 使服務器上的客戶端要求客戶端的ID(或會話ID)(如果你使用socket.io的websocketing這是標準)發起重新連接
  3. 以保持應用程序的狀態。這通常使用數據庫完成。如果你的服務器沒有其他狀態而不是客戶端之間的隊列(這是不太可能的),那麼你可能會尋找一個現有的持久隊列實現或建立你自己的快速本地存儲(redis浮現在腦海)
+0

「如果您的服務器沒有其他狀態,而不是客戶端之間的隊列」。我的應用程序目前實際上並沒有排隊。我的問題的一部分是我的問題是否表明使用隊列會有好處。 –

+0

很難知道,因爲它是非常特定的應用程序。但是隊列很少是​​最好的解決方案(如果你在db中實現一個隊列,情況會更糟糕)。在我製作的基於websocket的遊戲平臺中,應用程序的狀態只是持續存在,並且可以被客戶查詢。遊戲移動是由websocket發送的,但是如果應用程序斷開連接,它只需查詢狀態(在db服務器端持久存儲)。 –