2011-08-16 8 views
14

私はソーシャルネットワークの作成を計画しており、Facebookのステータス更新モジュールがどのように設計されているのかよく分かりません。私はここでいくつかの助けを見つけることができます願っています。アルゴリズムとデータ構造のレベルでは、ソーシャルネットワークでステータス更新メカニズムを作成する最も効率的な方法は何ですか?Facebookのステータス更新メカニズムの背後にあるデザインとアーキテクチャは何ですか?

すべての友だちのフルテーブルスキャンを行って、その更新をソートするのは非常に単純でコストがかかります。ハッシュや何か他のものに基づいた何らかの仕組みを使用していますか?私にお知らせください。

P.S:EdgeRankのアルゴリズムについては説明しませんが、基本的なステータスの更新については言及していません。どのようにしてそれらをデータベースから見つけて取得しますか?

ありがとうございました!

+0

https://stackoverflow.com/questions/1443960/how-to-implement-the-activity-stream-in-a-social-network – OhadR

答えて

23

あなたの質問にお答えするのはgreat presentationです。具体的な回答は約55分40秒ですが、プレゼンテーション全体を見て、ソリューションがアーキテクチャ全体にどのように適合しているかを理解することをお勧めします。要するに

  1. 特定のサーバ(「葉」)は、特定のユーザーのすべてのフィード項目を記憶します。あなたの友人のそれぞれのデータは、特定の目的地に完全に保存されます。
  2. ニュースフィードを表示する場合、アグリゲーターサーバーの1つが、友人のすべてのリーフサーバーに要求を送信し、結果をランク付けします。アグリゲータは、どのサーバが各フレンドのユーザIDに基づいてリクエストを送信するかを知っています。

これはもちろん、非常に単純化されています。これはすべてがmemcachedであるためにのみ機能し、システムは待ち時間を最小限に抑えるように設計されており、友人のフィードアイテムなどを含むリーフサーバーでいくつかのランキングが行われます。

本当にデータベースに合理的な速度でこれが動作するためのものです。 FBは主にキー値ストアとしてMySqlを使用します。テーブルをジョインすることは、自分の規模では不可能です。その後、memcacheサーバーをデータベースとアプリケーションサーバーの前に置きます。

あなたがそれらを持っているまで問題をスケーリングすることについては心配しないでください(もちろん、あなたがそれを楽しむことを心配している場合を除きます)。1日目に、スケーリングは問題の中では最小です。

+0

こんにちはニック、こんにちは、それは私の知識のために少し圧倒しても洞察力のあるプレゼンテーションでしたベース!リンクありがとうございました。私のフォローアップの質問の不愉快さのために私を許してください。しかし、どのようにして最下位のセルレベルで、「リーフ」サーバーと「集約」サーバーを視覚化するのですか。ソーシャルネットワーク上の各ユーザ専用のリーフと集約サーバ? – Ari53nN3o

+3

id、dataという2つのカラムを持つ巨大なデータベーステーブルを想像してみてください。彼らは[シャーディング](http://en.wikipedia.org/wiki/Sharding)を使ってIDに基づいてこのテーブルを分割します。したがって、ids 1-1000はserver1に存在し、ids 1001-2000はserver2などに存在します。これらの各サーバーは、FBが「葉」と呼ぶものです。 (つまりシャード)今度は、例えばid 30のものとid 1030のもののSUM()を実行する場合は、別々のサーバーに住んでいるのでできません。これはアグリゲーター・サーバーの1つが入ってくる場所です。リーフ・サーバーの両方に行き、行をフェッチします。次に、SUM()を実行し、結果を返します。 –

+6

ゲームのこの時点でスケールすることは、キーバリューストアにすべてを格納し、ジョインを利用しないなど、悪い習慣に陥ることによって、あなたより良い結果をもたらす可能性があります。学びたいFBは、その規模のために非常に特別なニーズを有する。しかし、彼らは始めたばかりで、多くのテーブルを持ち、多くのカラムを持ち、リクエストごとにテーブルを結合する、単一のMySQLデータベースサーバを使用していました。 100のうち99のプロジェクトについては、これはまだ方法です。 –

関連する問題