スケーラビリティについて質問があります。サーバーがすべてを処理する Uno などのマルチプレイヤー ゲームがあるとします。(簡単にするために、これはテキストのみのゲームであると仮定します)。たとえば、クライアントでユーザーに情報を出力するために、サーバーはPRINT string
やCHOOSE data
(プレイするカードを選択する) などを送信します。この点で、クライアントは「愚か」であり、サーバーはゲーム ロジックを処理します。
これがプロトコル レベルでどのように機能するかの簡単な例:
サーバーが送信:PRINT Choose a card
サーバーが送信: CHOOSE Red 1,Blue 1
(ユーザーがボタンまたは何かを表示し、赤の 1 を選択)
クライアントが送信:Red 1
私がこのアーキテクチャを持っているとしましょう:
プレーヤー クラスtellData(String data
: ユーザーが持っているカードを保存します。おそらく、PRINT データを送信するいくつかのメソッド ( など) でsendPM()
、ユーザーにプライベート メッセージを送信できます)
Server Class : 認証を処理し、ユーザーが新しいゲームを作成できるようにし、参加できるゲームのリストをユーザーに表示します
Game Class : カードをプレイしているユーザーを処理し、新しいプレーヤーへの切り替えを処理し、 などtellData()
のプレーヤー クラスのメソッドを呼び出します。pickCard()
複数のコンピューターでサーバーを実行するには、これをどのようにスケーリングしますか? 現在、すべてのユーザーが 1 つのサーバーに接続しており、相互にやり取りするには Player、Server、および Game クラスが必要です。誰かが提案を提供したり、これに関する優れたリソース/本を教えてくれたりすると、非常にありがたいです (いいえ、これは宿題やビジネスのためのものではありません。これは単なる個人的なプロジェクトであり、私の)。スケーラビリティの観点から、別のサーバーを追加して、プレーヤーの追加負荷を処理できるようにしたいのですが、同時接続数は最大で 1000 になります。
また、ゲームを追加すると、スケーラビリティの課題が大幅に難しくなりますか?
さらに、ゲームデータを保存する最良の方法は何ですか? SQL データベース、またはオブジェクトのシリアル化、または何ですか? つまり、3 人のユーザーが Uno のゲームに参加していて、後でそのゲームに戻りたいとします。カードとゲームに関する情報を Player/Server/Game クラス (RAM) に永久に保存したくありません - これをどこかにダンプしたいので、ユーザーがログインしたときに情報をロードできます。 RAM にダンプされ、次に適切な Player/Game オブジェクトにダンプされます。
最後に、サーバーを強制終了せずにサーバーに変更を加えて再起動するにはどうすればよいですか? サーバーが Java または Python で作成されているとします。
誰かが提案やいくつかのリソースを提供できる場合、それは大歓迎です-これには、私が最初に述べたアーキテクチャの変更が含まれます.
助けてくれてありがとう!!
編集: このテーマに関して、皆さんがお勧めする良い本や講演はありますか?