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-提要.html

本教程将帮助您使用 Redis 设置像 Pinterest 的提要这样的系统。这很容易上手。

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

于 2014-05-30T12:46:02.427 回答
2

除非我有一个可验证的性能问题,否则我个人不喜欢过早的优化,因为它经常成为我无休止的疯狂螺旋。您可能会发现这里也是如此。

于 2012-05-14T14:52:43.040 回答
1

过早的优化是万恶之源。

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

于 2013-05-30T15:01:14.847 回答