2014-07-25 85 views
0

我們如何在mongodb中使用mongoose實現Facebook狀態消息系統,每當任何給定用戶發佈自己的狀態時,都會在他的所有朋友時間線上進行廣播。在mongodb中實現facebook風格的狀態消息系統

它不一定是實時的,會有一個刷新按鈕來獲取最新的狀態。

這裏是我想出了:

計劃A:

status(collection) 
    id, user_id(reference), status_msg 

好處:更快的寫入速度

B計劃:

status(collection) 
    id, user_id(reference), status_msg, friends_list[sub-document] 

是nefit:更快的閱讀速度

隨着計劃A,我將不得不遍歷用戶在他的朋友列表中的所有朋友,然後獲取所有的狀態。 我必須爲每個朋友每次都做一次(頁面刷新/新登錄)。

對於計劃B,我只需要獲取friends_list中當前用戶的狀態。

我想知道您的意見和建議嗎?

有沒有更好的方法來解決這個問題?

我還想知道如何在這裏使用rabbitMQ來提高效率並降低不必要的數據庫I/O。

回答

0

假設每個用戶都可能有好幾個朋友,而且這些朋友每天都會多次刷新他們的時間表,那麼您可以假設閱讀的發生頻率比寫作的頻率高得多。這意味着從純粹的性能角度來看,您將優化讀取訪問權限,而不是寫入訪問權限,並將接收者與消息一起存儲。

但是,請記住語義。如果作者的朋友列表在發佈狀態消息後發生了變化,該怎麼辦?

  • 你想讓消息從任何前友人的時間線中消失嗎?
  • 你想讓消息出現在他們製作的任何新朋友的時間軸上嗎?

如果對這些問題的答案是肯定的,那麼應該確定讀取時的接收器而不是寫入。

還有一個值得考慮的第三個選項:不要由發件人處理郵件,由收件人處理。當某人發佈消息時,爲他們的每個朋友創建消息的單獨副本並將它們另存爲單獨的文檔。然後,您可以通過查詢您的消息收集來獲取他們是接收者的消息,從而爲用戶獲取所有消息。然後朋友/不友好操作將需要檢查需要添加/刪除的任何消息。這種方法的主要缺點是擁有很多朋友的用戶在發佈內容時會產生很高的寫入負載。