2012-03-28 47 views
0

我一直在尋找類似的問題,如MMORPG服務器 設計模式等,因爲這個概念本質上是相同的,但是,我來到 沒有滿意的結論我的問題。服務器更新過程設計模式

功能
本質上,(這是在Java中使用JBoss Netty的正在開發的)服務器軟件簡單地 允許認證設備的客戶端來發送和控制實體的數據,然後將其發送到指定範圍設備客戶端。

考慮途徑
1.使用固定的線程池,和隊列設備週期性更新,其中,所述服務器 執行用於內的設備的範圍內的實體進行檢查,並且發送適當 產卵/更新/銷燬數據包。
2.使用反應器樣式模型,其中事件發佈到反應器並同步處理
。例如,當設備更新實體或設備更新其位置時,可以發佈事件。服務器然後可以選擇設備的 範圍內的實體並且異步地傳送適當的創建/更新/銷燬包

3.在Netty事件線程上執行更新。例如,客戶端更新它的位置,服務器執行範圍內的實體檢查併發送相應的創建/更新/銷燬數據包的 。問題是,採用這種方法,服務器將不會傳輸實體,除非設備更新其位置。解決該問題的方法也可能是在實體創建/更新/銷燬 消息時選擇範圍內的設備,並同步更新每個設備。

這些只是我考慮過的幾種方法,我正在尋找最可伸縮的方法 ,因爲數據需要儘可能實時地提供儘可能少的延遲。 歡迎任何其他推薦的方法。

我很抱歉,如果我的問題缺乏足夠的信息,我會很樂意糾正任何錯誤 或按要求提供其他信息。

感謝您的回覆。

回答

0

這是我寫的一個multiplayer netty game server。你可能會在那裏找到你的答案。我尚未確定可擴展性部分。我在這裏看到多個選項。

  1. 不要在多個虛擬機之間共享狀態。這意味着玩家將獲得最低的延遲。缺點是如果他們的同齡人在那裏玩,他們將無法從一個vm跳到另一個vm。在這個模型中,傳入的事件將被存儲/記錄,並在發生崩潰等情況下,爲了耐久性,它們將被重播。像下面的chronicle會有所幫助。
  2. 在vm之間共享狀態。延遲可能會受到影響,但可擴展性肯定會更高。我正在查看hazelcast。這允許透明狀態共享發生。
+0

我實際上在研究它時下載了一個源代碼的副本,並且在我看來你正在Netty I/O線程(即messageReceived)上執行更新,通過查看示例遊戲服務器。那是對的嗎? – Greenyyy 2012-03-29 13:37:50

+0

不可以。如果您查看handlers.netty包中的DefaultToServerHandler類,您將看到playerSession.onEvent(event)。此調用實際上是異步的,因爲Sessions EventDispatcher(您可以在event.impl包中看到2個事件調度程序)將它分派到不同的線程。同時在src/test中檢出JetlangEventDispatcherTest類。 PlayerSession * Test還將顯示如何完成異步事件分派。 – Abe 2012-03-29 16:25:43

+0

謝謝你的解釋:)審查後,我現在明白了。我想我會在單個線程池上一次處理一個I/O事件(比如spawn/update/destroy),然後是客戶端傳輸邏輯(它將在一個固定的或緩存的線程上並行執行池)。 另外,感謝您的回覆。 – Greenyyy 2012-03-29 16:42:10