我使用django活动流模块收集用户活动。 但是当一个用户(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)
谢谢
苏丹
但是如果我要优化它,我可能会生成另一个流,并且操作的时间戳由action_object timestamp设置。。。:)
除非我有一个可验证的性能问题,否则我个人不喜欢过早的优化,因为对我来说,它常常会变成一个无休止的螺旋式的疯狂。你可能会发现这里也是如此。在
在Fashiolista,我们已经公开了构建feed系统的方法。 https://github.com/tschellenbach/Feedly 它是目前最大的开源库,旨在解决这个问题。认为它还解决了开发时间与过早优化的问题。:)
首先,我将Redis作为一个数据存储。以后当你的网站变得更大的时候,搬到卡桑德拉是有意义的。在
构建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的一些文章:
相关问题 更多 >
编程相关推荐