3

ユーザーのアクティビティを収集するために django-activity-stream モジュールを使用しています。ただし、あるユーザー (user1) が別のユーザー (user2) をフォローしている場合。

次のユーザー (user2) のアクティビティ ストリームを取得し、すべてのアクティビティを日付と時刻で並べ替える必要があります (以下のコードを参照)。

アクティビティ リストが大きくなるので、パフォーマンスと最適化の問題に直面すると思います。誰かがすでに同様の問題を解決していると思います。

アクティビティの生成をより効率的にするためのアイデアやアドバイスはありますか?

def build_activity(raw_activity):
    activity = []
    for item in raw_activity:
        action_object = get_action_object(item)
        activity.append({
            'user': User.objects.get(pk=int(item.actor_object_id)),
            'verb': item.verb,
            'action_object': action_object[1],
            'type': action_object[0],
            'timestamp': timesince(item.timestamp),
            'datetime': item.timestamp,
        })
    return activity


def activity_stream(user):
    from actstream.models import actor_stream
    raw_activity = actor_stream(user)
    activity = build_activity(raw_activity)
    for following in Follow.objects.filter(user=user):
        stream = actor_stream(following.target_user)
        activity += build_activity(stream)
    return sorted(activity, key=lambda item:item['datetime'], reverse=True)

ありがとう、

スルタン

4

3 に答える 3

3

Fashiolista では、フィード システムを構築するアプローチをオープンソース化しました。 https://github.com/tschellenbach/Feedly 現在、この問題の解決を目的とした最大のオープン ソース ライブラリです。開発時間と時期尚早の最適化の問題も解決すると考えてください。:)

まず、Redis をデータストレージとして使用します。後でサイトが大きくなったときに、Cassandra に移行することが理にかなっていることがよくあります。

Feedly を構築したのと同じチームが、複雑さを処理するホスト型 API も提供しています。getstream.ioをご覧ください。現時点では、Python、Ruby、Node、および PHP 用のクライアント API があります。さらに、高度に最適化された Cassandra セットアップに基づいているため、Redis に基づく自己ホスト型ソリューションよりもはるかに低い価格で価格を設定できます。

さらに、この高スケーラビリティの投稿を見て、関連する設計上の決定事項のいくつかを説明しました: http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic- feeds.html

このチュートリアルは、Redis を使用して Pinterest のフィードのようなシステムをセットアップするのに役立ちます。始めるのはとても簡単です。

フィードの設計についてさらに学ぶには、Feedly の元になった次の記事を読むことを強くお勧めします。

于 2014-05-30T12:46:02.427 に答える
2

検証可能なパフォーマンスの問題がない限り、個人的には時期尚早の最適化は嫌いです。この場合も同様であることがわかるかもしれません。

于 2012-05-14T14:52:43.040 に答える