1

Facebook チャットなどのチャット IM と同じように、Ruby と Redis (または任意の NoSQL ソリューション) を使用してオンラインの友達リストを実装する方法を考えるのに苦労しています。私の要件は次のとおりです。

  • 総ユーザー数 約100万人
  • DB はユーザー フレンドの ID (整数値のセット) のみを保存します。

Redis クラスター (実際にはあまり詳しくありません) を使用して、http://www.lukemelia.com/blog/archives/2010/01/17/redis-のラインに沿って何かを実装することを考えています。実践中のwhos-online/ .

更新:私たちのアプリケーションは、潜在的にオンラインの友達リスト以外の目的で Redis を実際に使用することはありません。さらに、実際には書き込み負荷は高くありません (私たちのクエリのほとんどは、オンラインの友人の読み取りになると思います)。

4

3 に答える 3

4

Redis DB Googleグループでこの質問について話し合った後、提案された解決策(この記事に触発された)は、SADDすべてのオンラインユーザーを単一のセットにまとめ、ユーザーごとに、user:#{user_id}:friends_list友達リストを作成して別のセットとして保存することです。ユーザーがログインするたびに、SINTERユーザーの友達リストと現在のオンラインユーザーが設定します。読み取りが多く、書き込みが重いわけではないため、書き込みには単一のマスターノードを使用します。スケーリングするために、マスターから複製するスレーブノードのクラスターがあり、アプリケーションは単純なラウンドロビンアルゴリズムを使用してSINTER

Josiah Carlsonは、より洗練されたアプローチを提案しました。

  1. ユーザーXがログオンすると、オンラインユーザーと設定した友達を交差させて、最初のオンラインセットを取得し、Y分TTLで保持します(ユーザーがサイトで何かを行うときはいつでも、有効期限を次のように更新できます。未来にY分以上なります)
  2. その「オンライン」セット内のすべてのユーザーについて、同様の「初期セット」を見つけ、そのセットにXを追加します
  3. ユーザーZがログアウトするたびに、友達セットをスキャンして、すべての友達からZを削除します(友達が存在するかどうかは関係ありません)。
于 2012-05-12T23:03:10.503 に答える
0

In Memory Data Grids を検討する必要があります。これらのプラットフォームは、このようなスケーラビリティを提供することを目的としています。通常、クラウドの任意のハードウェアにクラスターとして簡単に展開できます。参照: GigaSpaces XAP、vMware GemFire、または Oracle Coherence。無料版をお探しの場合は、XAP が Community Edition を提供しています。

于 2012-05-09T14:59:15.103 に答える
0

xmpp/jabber はどうですか? それらには大規模な同時使用が組み込まれており、信頼性が高く、ユーザー ログイン用のアダプターを作成するだけで済みます。

于 2012-05-04T02:51:44.167 に答える