現在、ゲームのソーシャル機能を提供するWebサービスを実装しています。このゲーム機能の1つは、フレンドリストを管理する機能です。ユーザーが追加できる友人は、彼が選択した外部のソーシャルネットワーク(現在のFacebookやTwitter)上にある連絡先によって異なります。データストアに応じて大きなデータセットをフィルタリングする最適なアプローチ
システムの現在の動作は次のとおりです。
- クライアントアプリケーションは、プレーヤーのコンタクトリストを取得するために、ソーシャルネットワーク(FacebookやTwitterの)APIを使用しています。
- この連絡先のそれぞれには、一意の識別子(つまり、彼が発信しているソーシャルネットワーク、およびこのソーシャルネットワーク上の識別子、たとえば "Tw12345")が付いています。
- クライアントは、これらすべての識別子のリストをGAEでホストされているゲームWebサービスに送信します。
- Webサービスは、自分のデータベースに一致するユーザーがある場合、各IDをチェックします。
- これは、ゲームデータベースにも一致するものだけを含むようにフィルタリングされた識別子のリストを返します。
ほとんどのユーザーの連絡先リストが膨大であるため、明らかにうまく機能しません。サーバーは、一致するゲームアカウントを持つ連絡先をフィルタリングするためにデータベースをチェックするのに多大な時間を費やしています。
今、私はより効率的にどのように進むことができるかを考え出すのに苦労しています。識別子が指定された順序に従わないため、整数演算を使用してデータベース上のユーザーを選択することはできません。また、私は自分の側でフィルタリングを行うためにTwitterやFacebookに依存することはできません。なぜなら、そのAPIによってサポートされていないからです。
「既知の」識別子のリストを格納するために、ある種のmemcachedデータツリーを使用するシステムを考えました。(クエリは、一致するユーザーが存在することを知る必要があり、正確には一致するユーザーではありません)キャッシュがクリアされるたびにビルドにかかる時間を恐れています。
このような設定に関連したトラブルの経験があれば、私はそれを聞いて非常にうれしく思います!ありがとう!
興味深い質問ありがとうございます。私が正しく理解していれば、どちらの要素が両方のセットのメンバーであるか(連絡先と既にプレイヤーの両方)を知りたいと思う。これが本当にあなたが望むものであれば、2つのセットの共通要素を見つけることができるはずです。私が間違っていない場合、あなたのWebサービスは、2つのリストを両方のリストにあるどんな要素でも出力として入力として受け取ることができます。私は要件について間違いを犯しているかもしれません。実際のコーディング作業を公開すると、より多くのお手伝いをすることができます。 +1とにかく私は本当に興味深い問題を見つける。 –