0

GWT / Javaを使用してGAEでゲームアプリを作成していますが、サーバー側の永続データに問題があります。プレーヤーはRPCを使用して、アクティブなゲームとゲームの状態をポーリングしています。これらはすべてサーバー上のストアです。クライアントのポーリングで、存在するはずのゲームインスタンスが見つからないことがあります。これは、Google Appspotにデプロイした場合にのみ発生し、ローカルではすべて問題ありません。

これは、appspotがクラウド化されたサービスであり、サーブレットの新しいインスタンスをいつでも生成して使用でき、既存のデータがインスタンス間で保持されていないことに関係している可能性があることを理解しています。

単一のゲームは1〜2分しか続かず、データは急速に(1秒間に複数回)変化するので、異なるインスタンスへのRPC呼び出しが同じサーバー側データを使用するようにするための最良の方法は何ですか?

私はDataStoreAPIを調べましたが、データベースのようなストレージのようですが、必要なものには遅すぎると思います。また、Memcacheはいつでもフラッシュできるため、役に立ちません。

ここで何が欠けていますか?

4

3 に答える 3

3

ここには2つの問題があります。リクエスト間でのデータの永続化とクライアントからのデータのポーリングです。

  1. 分散サーブレット環境(GAEなど)を使用している場合、1つのインスタンスにリクエストを送信したり、データをメモリに保存したり、他のインスタンスでデータを利用できることを期待したりすることはできません。これは、GAEおよび複数のサーバーがあるその他のサーブレット環境に当てはまります。

    したがって、データを共有ストレージに保存する必要があります。データストアは、コストがかかり、永続的で、信頼性が高く、低速です。Memcacheは高速で無料ですが、信頼性はありません。通常、両方を組み合わせて使用​​します。一部のライブラリは、NDBobjectifyの両方を透過的に組み合わせています。

    GAEには、半永続的な共有データを持つ3番目のオプションであるバックエンドもあります。これらは常時接続のインスタンスであり、起動/シャットダウンを制御します。

  2. データポーリング:複数のクライアントが更新を待機している場合は、ポーリングを使用しないことをお勧めします。ポーリングは多くの不要な要求を行い(サーバー上でデータは変更されませんでした)、それでも最小の遅延があります(一定の間隔でポーリングするため)。ポーリングの代わりに、ChannelAPIを介したプッシュを使用します。そのためのGWTライブラリもあります:gwt-gae-channelgwt-channel-api

于 2012-05-16T18:31:32.310 に答える
1

簡単な答え:AppEngineで実行するようにゲームを設計していません。

あなたはすでにあなた自身の質問に答えたように聞こえます。データはインスタンス間で永続化されないことを理解しています。サーバー側でデータを永続化するための2つのメカニズムは、memcacheとデータストアですが、これらの制限についても理解しています。これを中心にゲームを設計する必要があります。

memcacheまたはデータストアを使用していない場合、データをどのように永続化していますか(私の推測では、実際にはデータを永続化していないと思います)。漠然とした詳細から、複数のインスタンスにまたがって実行できるようにゲームを設計していません。これは、AppEngineで実行されるすべてのアプリに不可欠です。HTTPリクエストがどのインスタンスにヒットするかわからないことが基本的な設計原則です。データストア+memcacheを使用するには、再設計する必要があります。

単一のサーバーを使用する場合は、バックエンドを使用できます。バックエンドは、単一のサーバーのように動作します(1つのインスタンスに制限する場合)。率直に言って、コストがかかるため、このルートを使用する場合は、AmazonまたはRackspaceを使用する方がよいでしょう。また、独自にスケーリングに対処する必要があります。つまり、ゲームが特定のサーバーインスタンスで実行されている場合、ゲームのプレイが一貫してそのインスタンスにヒットするように方法を構築する必要があります。

于 2012-05-16T14:43:14.763 に答える
0

GAEなしでGWTアプリケーションをデプロイできることを忘れないでください。次の説明を参照してください。

https://developers.google.com/web-toolkit/doc/latest/DevGuideServerCommunication#DevGuideRPCDeployment

アプリケーションに複数のサーバーインスタンスまたはGAE固有の機能が必要になることはありますか?

もしそうなら、memcacheなどに関するPeterKnegoの回答に同意します。

そうでない場合は、別のホスティングオプション(GAE以外)を選択することで問題を回避できる可能性があります。特に、単一のインスタンスで作業できるものです。そうすれば、これまで行ってきたように、サーバーメモリ内のすべてのゲームデータを簡単に管理できます。

このソリューションが目的に合っている場合は、適切なホスティングプロバイダーを見つけるだけです。これはクラウドベースのPaaSオファーである可能性があります。ただし、サーバーインスタンスの数に(GAEとは異なり)厳しい制限を設けることができ、サーバーインスタンスの数を1つに減らすことができます。たとえば、Heroku (現在)では、私が理解している限り、これを実行できます。このスレッドによると、GWTアプリケーションに適しているようです。

https://stackoverflow.com/a/8583493/2237986

上記の解決策には少し手間がかかり、強力な推奨を行うのに十分なニーズがわからないことに注意してください。あなたがやろうとしていることに対して、より簡単でより良い解決策があるかもしれません。特に、非常にタイムクリティカルなリアルタイムマルチプレイヤーゲーム用に最適化された非クラウドベースのホスティングオプションとサーバーアーキテクチャをご覧ください。

お役に立てれば!進捗状況をお知らせください。

于 2013-04-03T00:29:21.670 に答える