SNS中好友動態功能的設計思路

現在大部分SNS網站都有一個功能,就是顯示好友的活動狀態,比如你的好友上傳了一張照片、分享了一篇文章等等動作,都可以顯示在你的頁面裏,這樣大大增強了社區的互動性,也成爲現在SNS網站的主要特徵,對於這樣一個功能,從設計角度,還是值得思考的,並不簡單,特別是用戶越來越多,信息海量增長的時候,我未必能提出十全十美的方案,但我們可以由簡如繁梳理一下思路。

首先我們要定義用戶的活動消息,也可以理解爲一個事件,就是我們舉的例子:用戶上傳照片、與別人結爲好友、修改了個人資料等等,動作各有不同,但需要在結構上通用,我們先設計一個

ID //消息ID
UserID //用戶ID
MsgType //消息類型,比如加好友、上傳照片等不同的類型
EventMsg //消息的內容,這裏我們可以用Json的數據格式來描述出不同的活動內容
CreateTime //消息創建時間

這個結構也是個數據庫的結構,當用戶做個一個動作之後,就會創建這樣一個消息,並保存在數據庫中,當顯示好友的活動信息時,就從這張表裏查詢自己好友id的數據,並按時間顯示,這個做法是一個最簡單的實現,但會出現一些問題,當你與一個用戶成爲好友之後,該好友之前發生的動作會顯示出來,而不是在成爲好友時點之後的動作,同樣,切斷好友關係之後也有類似的問題,如果從業務角度和用戶體驗上可以接受的話,也沒什麼,但由於信息是按時間排序,有時候會給用戶錯亂的感覺,還有,這個信息不能刪除,如果刪除了所有好友就看不到這條信息了,但在Facebook裏是則是可以刪除好友的動作信息的,這個方法還有一個問題是,所有信息都放在一張大表裏,在信息爆炸增長,個人好友也很多的情況下,查詢效率會非常低,產生嚴重的性能障礙,如果對這張表做水平切分,則在實現上覆雜了許多,性能也未必好很多,接下來我們再思考是否有更好的解決辦法。

在SNS的理論裏,個人好友的合理數量在150個左右(最近有文章說Facebook的人均好友數是120人 ),SNS 網站應該是有好友數量的限制的,我們就按人均150個好友來設想,是否可以在用戶發生某些動作之後,針對他的所有好友都寫入一條信息,所能解決的是,信息是在用戶成爲好友時點之後寫入,用戶可以刪除好友的活動信息,不影響其他用戶的顯示,在顯示時查詢效率要高很多,但是負面效應也十分明顯,一個用戶的動作有平均150個寫入,對於數據庫來說開銷也非常大,我們想想在這樣的設計下,是否可以提高性能。

首先看數據庫設計,我們要把信息表和信息與用戶的對應表分開,我們上面定義的數據結構保留,我們定義它的表名爲Event,我們再新建一張表EventUser,結構如下

ID  //主鍵
EventID //Event表的ID
FriendUserID //好友的ID
CreateTime //消息創建時間

對FriendUserID做索引,當用戶發生動作時,首先將動作信息寫入Event表,之後查找用戶的所有好友,將EventID、好友ID逐條寫入EventUser表,當要顯示自己的好友活動信息是,查詢EventUser中FriendUserID等於自己ID的信息,並和Event表做一個Join查詢就可以了。

進一步提升性能的方法,將Event裏的信息緩存,比如用Memcached,EventID做爲Key,內容做爲Value,這樣,查詢 EventUser是就不用Join Event表,而是從緩存裏讀取,由於要記錄給每個好友的信息,所以EventUser會變得非常大,平均要比我們最初設計的數據容量大150倍,我們對 EventUser表做水平切分,根據用戶ID做Hash算法,基本上能均勻的分配到所有的表中,至於EventUser水平切分的算法還有多種,根據實際情況來定,總的來說就是把數據分攤掉,同時EventUser裏的數據可以不永久保存,做定期刪除,可以保持數據容量在一個合理的範圍內。

對於用戶動作之後的數據寫入,可以採用異步的方法,在發生動作時,拋出一個消息,由另外一個線程在做寫入操作,如果對每個動作平均150次的寫入仍存顧慮,我們可以針對每個用戶開出一塊內存空間,或是緩存,裏面保存最後50條最新的好友動作,並在每條記錄裏做一個持久化標誌,當有50條信息都標誌是 “未持久化”時,做一次數據庫的寫入,然後把信息置爲“已持久化”,這種非實時寫入的方式,可以提高一定的數據庫效率,顯示時,先從內存中取出,再查數據庫。

還有一些問題,對不不同消息類型的處理方式不同,比如用戶修改個人資料,並不是每次發生這樣的動作都要做一次給朋友做一次“羣發”的操作,如果遇到這個人在短時間內做了多次修改個人資料的操作,就給朋友發出多個消息,會產生垃圾信息,讓人覺得很怪異,所以對於這樣的操作會有一定的時效性,比如在一天之內的修改個人資料,就是一個消息,這時候的處理是更新,而不是插入。

以上是我對SNS中好友動態功能的設計思路,可能還有一些未想到的問題,還需要認真思考。



轉載自:http://i.laoer.com/tag/sns

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章