0

Twitterのようなフォローメカニズムを構築しようとしています。ユーザーがアクションを実行します。すべてのユーザーのフォロワーのリストを作成し、すべてのストリームに何らかの情報を入力します。これには時間がかかる可能性があるため (10,000 人のフォロワーがいて、情報を挿入するストリームが 10,000 ある場合、つまり、おそらく 10,000 の SQL 呼び出し)、アクションを実行するユーザーが移動できる間に、これがバックグラウンドで行われるようにしたいと考えています。彼の人生を続けてください。

そこで、私が考えている戦略は次のとおりです。

  • ユーザーがアクションを実行します。
  • php スクリプトは、すべての作業を行う別の php スクリプトを開きます。これには 1 ~ 2 秒かかる場合があります。
  • その間、アクションを実行したユーザーは自分の人生を続けることができ、スクリプトはそのまま進行し、高速です。

考え?また、SQS のようなキューを使用して遊んでいましたが、このアプローチも機能するように思えますか? さらに、(私にとって) ローカルでテストしやすく、ec2 以外のホストで実行しやすいという利点があります。

これが良いアプローチである場合、php スクリプト内から php スクリプトを開くにはどうすればよいでしょうか? (phpスクリプトがURLにある場合)そのスクリプトが存在するURLを取得するのと同じくらい簡単でしょうか?

4

2 に答える 2

3

これが説明されている方法は、そのユーザーをフォローしているすべての人のために最初のユーザーの投稿を複製/複製したいように聞こえますか? これは、データ ストレージの悪夢になるでしょう。

別の視点から見る必要があります。次のモデルを検討してください。

ユーザー A が朝食に食べたものを投稿します。これは、ユーザー ID とともにテーブルに 1 回格納されます。

ユーザー B は自分の「ストリーム」を見ます。これは動的に作成される投稿のリストです。この時点でユーザー B は 50 人をフォローしています。ユーザー B のスクリプトは、ユーザー B がフォローしているユーザーの最新の最初の 50 件の投稿を取得し、ユーザー B の「ストリーム」に表示します。

このモデルでは、軽薄な朝食の更新ごとに、ユーザーごとに複数の投稿が発生することはありません. また、フォロワーの数は、つぶやきを公開するために必要な処理時間を拡大しません。つまりツイート。

明確化

正規化を行うだけです。したがって、users テーブル、users_following テーブル、posts テーブルが作成されます。クエリは次のようになります。

SELECT posts.* FROM users_following
         LEFT JOIN posts ON posts.user_id = users_following.followed
         WHERE users_following.follower = $idOfUserB
         ORDER BY posts.created LIMIT 50;
于 2010-09-21T13:55:45.737 に答える
0

サイトをまったくスケーリングしたい場合。

  • まず、 redis /beanstalkd/ gearmandなどのメッセージ キューを使用する必要があります。
  • 次に、redis/memcached などを使用してメモリ内で操作を行う必要があります。アクティブなデータセットをメモリに保持するのに十分なメモリがあることを確認してください。

(情報を挿入するための 10,000 のストリームである 10,000 人のフォロワーがいる場合、つまり、おそらく 10,000 の SQL 呼び出し)

10,000 回の SQL 呼び出しで、失敗したクジラが上書きされました。そのようなアプリケーションにはMySQLを使用しません(または少なくともmemcachedで使用します)が、redisを使用します。アクティブなデータセットをメモリに保持します。データモデルをできるだけシンプルに保ちます。

これが良いアプローチである場合、php スクリプト内から php スクリプトを開くにはどうすればよいでしょうか?

そうしないでください。lpush を介して redis のブロック リストにメッセージを追加し、blpop (デーモン プロセス) を介してそれらを読み取ります。最初にオンライン ユーザーのリストを入力し、次にオフライン ユーザーのリストを入力します。オフライン ユーザーは、オンラインではないため、遅延を気にしません。その人をフォローしているすべてのユーザーのリストにキーへの参照を置き、mget を介してすべてのキーを取得します。

(phpスクリプトがURLにある場合)そのスクリプトが存在するURLを取得するのと同じくらい簡単でしょうか?

ここでも URL を呼び出さず、メッセージ キューを使用します。url を呼び出すと、望ましくないオーバーヘッドが発生します。

素晴らしい。SQL に戻ります :) 500 人をフォローしていても、これは高速ですか? –</p>

SQL は、高負荷でクジラに大きな時間を与えます。少なくとも memcached が必要です! しかし、代わりにredisを使用します。

于 2010-09-22T00:31:46.280 に答える