2009-04-29 11 views
1

多くのテーブルをホストするポーカーゲームサーバーを考えてみましょう。ロビーにいるプレイヤーは、すべてのアクティブなテーブルとそのステータスのリストを持っています。これらの統計は、プレイヤーがテーブルに参加したり、プレイしたり、出たりする間に絶えず変化します。テーブルを追加したり閉じたりすることができます。 どういうわけか、これらの変更をクライアントに通知する必要があります。多くのクライアントとサーバー上のリストを同期するにはどうすればよいですか?

どのようにこの機能を実装しますか? ロビーにTCP/UDPを使用しますか(つまり、ユーザーがロビーを監視するためにサーバーに接続した場合、または要求 - 応答メカニズムを使用する場合) サーバーは各イベントについてクライアントに通知しますか、またはクライアントがサーバーをポーリングする必要がありますか?

このようなシステムの最も重要な目標は、拡張性です。すべてのユーザーが複数のサーバーで構成された1つの大きなリストを表示する必要がありますが、それに対応するためにサーバーを追加するのは簡単です。

答えて

1

この特定の問題は、アプリケーション設計における非常に基本的な問題、つまりクライアントがどのようにサーバーに接続するべきかを表しています。

スケーラビリティが問題になる場合は、Reactor design patternのようなノンブロッキングI/Oパターンを使用して、常にスケーラブルなソリューションを利用してください。このようなパターンの実用的かつ試験済みの実装を既に有する標準的なソリューションを使用することが、より好ましい。

特に、あなたのケースでは、絶え間なく更新されている即効型のゲームが関係しています。TCPを介して各クライアントへの接続を保持するスケーラブルなサーバー(やはり非ブロッキングI/O)彼が知る必要のある情報を更新します。

リクエストレスポンスサイクルはあなたのケースではあまり適切ではありませんが、これはアプリケーションの正確な仕様と照合する必要があります。

サーバーがリストに適用されている操作の固定長のキューを保持しますインターフェイスを介して(追加、削除、およびexsisting項目を変更すること)リストを更新:私の基本的な提案だ

+0

私がスケーラビリティに注意を払う理由は、正確な仕様が分かっていないということです...しかし、例として、オンラインポーカーゲームのロビーには、繰り返し更新されるアクティブなテーブルのリストがあります。具体的な数字が必要な場合は、今PokerStartsに200,000人のプレイヤーと30,000のテーブルがあります – Meat

0

。各操作にタイムスタンプが与えられます。キューがいっぱいになると、最も古い操作が順次廃棄されます。

ユーザーが最初にリストを取得する必要がある場合、ユーザーにリスト全体を送信するようサーバーに要求します。サーバーは現在のタイムスタンプでリストを送信します。

クライアントが任意の時間(10-30秒?)になると、クライアントは、タイムスタンプを取得してからリストに適用されたすべての操作をサーバーに要求します。 サーバーは、タイムスタンプがリストにまだ表示されているかどうかを確認します(つまり、最初のアイテムのタイムスタンプより大きい場合)。そうであれば、その時刻から現在までの操作のリストをクライアントに送信します。現在のタイムスタンプそれが古すぎる場合、サーバーは完全なリストを再度送信します。

UDPはこのアプローチに適しているようですが、しばらくして「更新サイクル」が失われても大したことではないからです。

+0

元の質問にこのような情報を追加してください。 –

+0

なぜですか?それは複数の解決策を持つことができる未解決の問題です。これは私が提案する1つの解決策であり、それは質問から独立しています。 – Meat

関連する問題