5

私は NGO のインスピレーション サイトに取り組む予定で、Facebook 風のイベント ストリームの実装を検討しています。たとえば、「マイケルがアップルパイを勧めた」、「ジョンがチョコレート ケーキについてコメントした」、「< em>Caramel fudge は Alice によって 8 時間前に投稿されました」など。

問題は、これらのイベントはインタレスト ベースであるため、キャラメルとチェリーだけに興味がある人は、アップル パイやチョコレート ケーキを見てはいけません。これには多くの順列があり、ユーザーのパーソナライズされたイベント ストリームをオンザフライで生成すると、かなり高価なデータベース クエリが必要になります。

そこで私の考えは、アクション イベントが発生するたびに何らかのバックグラウンド処理を行うことで、受信ユーザーと投稿されたイベント (おそらく単純な SQL JOIN テーブル) の間の関係を事前に生成することでした。

イベントに対して何百人ものユーザーの好みを比較検討するために必要な作業はかなりの量になるはずです。そのため、作業をトリガーする POST リクエストの一部として行うことはできません。別のプロセス。私は現在、このタスクについてGearmanを検討していますが、提案を歓迎します。

私の代わりに仕事をしてくれる人を探しているわけではありませんが、このようなものを構築した経験がある人がいたら、ぜひ感想を聞かせてください。

4

5 に答える 5

2

私はソーシャル ネットワーキング サイトでニュース ストリームを構築した経験があります。はい、複数の種類のイベントと複数のレベルの関心 (またはプライバシー設定、またはユーザー権限) がある場合、クエリは非常に複雑になる可能性があります。

イベントが生成されるよりも頻繁に表示されるという前提で、何らかの非正規化を行い、誰かがニュース ストリームを要求するたびにではなく、イベントが発生したときにイベントの潜在的な視聴者を計算することは理にかなっています。

I would suggest running a background process which converts these event objects (related to their creators) into simpler message objects (related to their reader, the people who see them on the news stream). You may end up with many messages per event, but this will make requests to to the front-end much quicker, and offload the work onto the background processes.

I've not used Gearman, but if it is the sort of thing which allows you to load up your app's environment in a background process and receive the events to process through a queue, then it's probably a good idea.

My simple solution was to roll my own using beanstalkd and my own PHP scripts.

于 2009-12-06T15:04:16.683 に答える
1

DB がどのように構成されているかはわかりません (詳細を教えてください)。

SELECT events.* FROM events, event_tags, user_tags
     WHERE event_tags.event_id = events.id 
         AND event_tags.tag_id = user_tags.tag_id
         AND  user_tags.user_id = <$user_id>

いたるところにインデックスがあると仮定すると、私にはそれほど重くは見えません

于 2009-12-06T15:04:19.150 に答える
1

これは、適切なインデックスで解決できるもののように思えます。データベースがそれを処理できるという仮定に基づいてソリューションを構築しますが、データベースの前にサービスを配置し、すべてのクライアントがこの時点を通過できるようにします。処理が遅くなり始めた場合は、このレイヤーにさまざまな種類のキャッシュを導入できます。ほとんどのパフォーマンスに関する決定と同様に、最初からそれを行おうとするのは、おそらく良い考えではありません。

于 2009-12-06T15:06:04.683 に答える
1

Facebook はこの種のことを行うために独自のデータベースを開発し、それをオープンソース化しました。私はそれについてあまり知りませんが、一見の価値があると思います.

于 2009-12-06T15:08:06.207 に答える