我使用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)
谢谢,
苏丹
答案 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时间戳设置...:)