Django:收集用户,对象活动流

时间:2012-05-14 14:33:55

标签: python django android-activity

我使用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)

谢谢,

苏丹

3 个答案:

答案 0 :(得分: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

This tutorial将帮助您使用Redis设置类似Pinterest的Feed。开始使用非常简单。

要了解有关饲料设计的更多信息,我强烈建议您阅读我们基于Feedly的一些文章:

答案 1 :(得分:2)

除非我有可验证的性能问题,否则我个人不喜欢过早优化,因为它经常成为我疯狂的疯狂。你可能会发现这也是这种情况。

答案 2 :(得分:1)

  

过早优化是万恶之源。

但是如果我要优化它,我可能会生成另一个流,并且动作的时间戳由action_object时间戳设置...:)