1

ゲームサイトを開発しようとしています。ユーザーは他のユーザーを友達として追加できます。ユーザーは、さまざまなゲームレベルを完了すると、ポイントを獲得できます。次に、すでにゲームをプレイしたすべてのユーザーの友達の平均ポイントをページに表示する必要があります(例:ユーザーがゲームAをプレイすると、友達が獲得したポイントの平均がゲームAページに表示されます。同様にゲーム彼がゲームB)をプレイするとき、彼の友人のB平均ポイントが表示されます。

私のアプローチ:

  • ユーザーのフレンドリスト(最大1000)を複数値のプロパティとしてデータストアに保存し、ユーザーがサイトにログインしたときにGAEmemcacheにロードします。
  • 常駐バックエンドを使用して、すべてのユーザーのゲームデータ(特定のゲームごとに獲得したポイント)をキャッシュします。cronジョブは、バックエンドキャッシュを1時間ごとに更新します。ユーザーが初めてゲームページ(例:ゲームA)をリクエストすると、リクエストハンドラーはバックエンドに連絡して、URLフェッチサービスを介して友達ポイントの平均を計算します。
  • これで、バックエンドはmemcacheからユーザーのfriends-list(Max 1000)を取得し、メモリ内キャッシュ(バックエンドキャッシュ)からゲームAポイントをフェッチして、計算された平均を返します。平均を取得した後のリクエストハンドラーは、データストアに保持し、memcacheに保存して、ゲームAページへの後続のリクエストがバックエンドでの計算オーバーヘッドなしにmemcache/datastoreからデータをフェッチできるようにします。この平均は1時間有効で、その後、ゲームAページへの次のリクエスト時に再計算されます。

私の質問

  • 上記のアプローチは、この問題を解決する正しい方法ですか?
  • バックエンドインスタンス(python-2.7)を使用してメモリ内キャッシュを効率的かつ確実に実装するにはどうすればよいですか?
  • このジョブのみのバックエンドで必要なメモリとCPUを見積もる方法は?(「userid / gamename」をキーとして、user-pointsを値として、10万のキーと値のペアを格納する必要があると仮定します。ユーザーフレンドリストの最大サイズは1000です。)
  • 負荷が増加するにつれて複数のバックエンドインスタンスを使用する必要がある場合、それらの負荷をどのように分散しますか?

前もって感謝します。

4

1 に答える 1

0

カウンターについては、Nick Johnson による次のブログ投稿をご覧ください。

NDB データストアを次の目的で使用します: - 独自の memcache の代わりに自動キャッシング - NDB には次のようないくつかの新しい興味深いプロパティがあります: Python リストのように機能する、圧縮を伴う json プロパティ、繰り返されるプロパティ

そして、効率的な更新のために mapreduce を見てください。

于 2013-01-24T05:03:31.600 に答える