2012-05-14 39 views
3

我使用django-activity-stream模塊來收集用戶活動。 但是,當一個用戶(用戶1)跟隨另一個(用戶2)。Django:收集用戶,對象活動流

我需要獲取以下用戶(用戶2)的活動流,併合並按日期和時間排序的所有活動(請參閱下面的代碼)。

而且由於活動列表增長,我認爲我會面對性能和優化問題。 我相信有人已經解決了類似的問題。

關於如何使活動生成更有效的任何想法和建議?

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

「但是,當Ø ne用戶(user1)跟隨另一個(user2)。「那又怎麼樣? – jpic

回答

3

在在Fashiolista我們opensourced我們建立飼料系統的方法。 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將幫助您設置喜歡用Pinterest的Redis的飼料的系統。開始很容易。

要了解更多有關飼料的設計,我強烈建議你閱讀一些文章,我們根據資訊提供ly上:

2

除非我有一個可驗證的性能問題,我個人不喜歡過早的優化,因爲它往往成爲一個無限循環進入瘋狂的我。您也可能會在這裏發現這種情況。

1

不成熟的優化是萬惡之源。

但如果我是要優化這個,我可能會產生另一個流,以及對這些行動的時間戳由action_object時間戳設置... :)

+0

現在我們使用Redis來存儲最新的活動流,真正使它處理這種挑戰變得簡單 – sultan

+0

@sultan很高興知道:)我想我很快會遇到類似的問題。你還在用django-actstream嗎?或者它被完全重寫了?謝謝! –

+0

不,我們停止使用它並將活動轉移到與redis相關的簡單模型 – sultan