1

リリースされたばかりのiOSゲームのバックエンドとしてGoogleAppEngineを使用しています。

ゲームをプレイするというその行為を通じて、プレイヤーはレベルを作成し、それからそれらは彼らの友人や世界全体と共有されます。GAEは、これらのレベルを保存および取得するために使用されます。GAEは、Game Centerが処理できるよりも複雑であるため、プレーヤーのハイスコアも管理します。

全体として、GAEはうまく機能します。負荷を常に監視しなくても、GAEが必要に応じて新しいインスタンスを起動する方法が気に入っています。このゲームでは、GAEは約10個のインスタンスを実行し、1秒間に約8個のクエリを処理します。

しかし、小さな問題があります。

プレイヤーがハイスコアテーブルに2回乗ることがあることに気づきました。新しいスコアを出す前に古いスコアを削除するので、これは不可能なはずです(これはGAEへの1つのクエリで行われます)。

いくつかのテストと突っ込みの後、プレーヤーはハイスコアを取得し、インスタンス1が古いスコアの削除と新しいスコアの追加を処理するように見えます。その後、プレーヤーは新しいハイスコアを取得しますが、今回はインスタンス4がリクエストを処理するものであり、他のスコアについてはまだ認識していません。

最速では、プレーヤーが新しいハイスコアを取得するのに10秒かかる場合があります。データの複製には2、3秒しかかからなかったと私は理解していました。

ロードによって2つのインスタンスが開始されることはめったにないため、テスト中にこの問題は発生しませんでした。

これは、何が起こっているのか、各インスタンスのデータがどのように保存されているのかについてのもっともらしい説明のように見えますか?

あるインスタンスで追加、削除、または変更されたデータが別のインスタンスで利用可能になることを保証する方法はありますか?ハイスコ​​アは「ミッションクリティカル」ではないので、あまり心配していませんが、データの一貫性が非常に重要である、より複雑な状況ではGAEを使用したいと思います。

それはGAEで可能ですか、それとも他の解決策を検討する必要がありますか?

4

1 に答える 1

2

データがすべてのデータセンターで一貫していることを保証することができます(強い一貫性)。それを達成するには、祖先クエリを使用する必要があります。ただし、そうすることで、1秒あたりの書き込み回数に制限が生じます。現在、制限は1秒あたり1回の書き込みです。

書き込み制限が遅すぎる場合は、キャッシュレイヤーを追加することもできます。したがって、結果整合性モデルを引き続き使用しますが、これらの結果をmemcacheの結果と混合します。

詳細については、ドキュメント「強一貫性のための構造化」を参照してください。

于 2012-08-22T18:38:20.630 に答える