2009-04-29 112 views
1

考慮一個託管許多表的撲克遊戲服務器。當一名球員在大廳時,他有一張所有有效表格及其統計數據的列表。這些統計數據不斷變化,而玩家加入,玩,離開表格。可以添加和關閉表格。 不知何故,這些改變必須通知客戶。如何同步多臺客戶機上的服務器列表?

您將如何實現此功能? 你會使用大廳的TCP/UDP嗎(也就是說,如果用戶連接到服務器來觀察大廳,或者你會去請求響應機制)? 服務器會通知客戶有關每個事件,還是客戶應該對服務器進行輪詢?

請記住:也許這樣一個系統最重要的目標是可擴展性。爲了應對不斷增長的困境,應該很容易添加更多的服務器,而所有用戶都應該看到一個由多個服務器組成的大列表。

回答

1

這個特定的問題是應用程序設計中一個非常基本的問題的表現 - 客戶端應該如何連接到服務器。

當可擴展性成爲問題時,請始終採用可擴展的解決方案,使用非阻塞I/O模式,如Reactor design pattern。更希望使用已經具有這種模式的工作和測試實現的標準解決方案。

具體來說,在你的情況下,這涉及到一個不斷更新的快速動作遊戲,使用一個可擴展的服務器(同樣是非阻塞I/O)通過TCP持有到每個客戶端的連接似乎是合理的,並更新他需要知道的信息。

請求響應循環聽起來不太適合您的情況,但應根據您的應用程序的確切規範進行驗證。

+0

我在可擴展性上做了一個說明的原因是,確切的規格是不知道的......但同樣,例如,在線撲克遊戲的大廳裏有一個反覆更新的活動表列表。如果你必須有具體的數字,現在在PokerStarts上有200,000名球員和30,000張桌子 – Meat 2009-04-29 18:00:00

0

這是我的基本建議:

服務器通過,保持操作的固定長度已經應用在名單上的隊列接口更新列表(添加,刪除和更改exsisting項目)。每個操作都有一個時間戳。當隊列滿時,最舊的操作將被逐步丟棄。

當用戶首先需要檢索列表時,它會要求服務器向他發送完整列表。服務器發送帶有當前時間戳的列表。

一旦每個任意一段時間(10-30秒?),客戶端都會要求服務器從他獲得的時間戳以來向他發送所有已應用到列表的操作。 然後服務器檢查時間戳是否仍然出現在列表中(即它大於第一個項目的時間戳),如果是,則將客戶端從當時發生的操作列表發送到當前,再加上當前時間戳。如果太舊,則服務器再次發送完整列表。

UDP似乎很適合這種方法,因爲如果偶爾會發生「更新週期」丟失的情況,UDP就沒有了。

+0

請在原始問題中添加這樣的信息,並且不要打開自己的答案。 – 2009-04-29 17:51:50

相關問題