2011-12-14 9 views
2

現在、ゲームのソーシャル機能を提供するWebサービスを実装しています。このゲーム機能の1つは、フレンドリストを管理する機能です。ユーザーが追加できる友人は、彼が選択した外部のソーシャルネットワーク(現在のFacebookやTwitter)上にある連絡先によって異なります。データストアに応じて大きなデータセットをフィルタリングする最適なアプローチ

システムの現在の動作は次のとおりです。

  • クライアントアプリケーションは、プレーヤーのコンタクトリストを取得するために、ソーシャルネットワーク(FacebookやTwitterの)APIを使用しています。
  • この連絡先のそれぞれには、一意の識別子(つまり、彼が発信しているソーシャルネットワーク、およびこのソーシャルネットワーク上の識別子、たとえば "Tw12345")が付いています。
  • クライアントは、これらすべての識別子のリストをGAEでホストされているゲームWebサービスに送信します。
  • Webサービスは、自分のデータベースに一致するユーザーがある場合、各IDをチェックします。
  • これは、ゲームデータベースにも一致するものだけを含むようにフィルタリングされた識別子のリストを返します。

ほとんどのユーザーの連絡先リストが膨大であるため、明らかにうまく機能しません。サーバーは、一致するゲームアカウントを持つ連絡先をフィルタリングするためにデータベースをチェックするのに多大な時間を費やしています。

今、私はより効率的にどのように進むことができるかを考え出すのに苦労しています。識別子が指定された順序に従わないため、整数演算を使用してデータベース上のユーザーを選択することはできません。また、私は自分の側でフィルタリングを行うためにTwitterやFacebookに依存することはできません。なぜなら、そのAPIによってサポートされていないからです。

「既知の」識別子のリストを格納するために、ある種のmemcachedデータツリーを使用するシステムを考えました。(クエリは、一致するユーザーが存在することを知る必要があり、正確には一致するユーザーではありません)キャッシュがクリアされるたびにビルドにかかる時間を恐れています。

このような設定に関連したトラブルの経験があれば、私はそれを聞いて非常にうれしく思います!ありがとう!

+0

興味深い質問ありがとうございます。私が正しく理解していれば、どちらの要素が両方のセットのメンバーであるか(連絡先と既にプレイヤーの両方)を知りたいと思う。これが本当にあなたが望むものであれば、2つのセットの共通要素を見つけることができるはずです。私が間違っていない場合、あなたのWebサービスは、2つのリストを両方のリストにあるどんな要素でも出力として入力として受け取ることができます。私は要件について間違いを犯しているかもしれません。実際のコーディング作業を公開すると、より多くのお手伝いをすることができます。 +1とにかく私は本当に興味深い問題を見つける。 –

答えて

2

あなたが探しているユーザーごとにクエリを実行しているので、私はそれが遅いと仮定します。キー名をうまく使用すれば、これを行う必要がなくなります。

データベース内の各ユーザーに対して、キー名がソーシャルネットワークの一意の識別子に設定されたエンティティを挿入します。これらは既に使用しているものと同じものか、この目的のためだけに作成された新しい「インデックス」エンティティにすることができます。

識別子のリストが送信されたときには、そのエンティティのすべてのキー名に対して、たとえばMyKind.get_by_key_name(key_names)を実行するなどして、それらが存在するかどうかを識別するための一括取得操作を行います。

+0

残念ながら、私は既にキーベースのアクセスを使用しています。最大の問題は、1つのクエリ内で複数のユーザーを「グループ化」する方法がないため、潜在的なユーザーごとに1つのクエリを実行する必要があることです。そして、標準のTwitterアカウントでは、それは本当に高くなる可能性があります。鉱山は〜300 'datastore_v3.Get'呼び出しを引き起こします。 – Tyn

+0

@Tyn getはクエリではなく、リストと一緒に 'get_by_key_name'を使うか、キーのリストを使って' db.get'を使って、あなたが望むだけの数のレコードを取得することができます。個別に行う必要はありません。 –

+0

右私は 'get_by_key_name'がキーのリストを取ることができないことを知りませんでした。 Appstatsによれば、リスト内の項目ごとに1つの 'datastore_v3.Get'(これはかなり論理的です)がまだ生成されているので、それははるかに優れていますが、まだかなり遅いです。ありがとう、しかし! – Tyn

関連する問題