圖7 Pinnability的模型流程
興趣Feed的技術(shù)要點(diǎn)
分析完P(guān)interest的興趣Feed實(shí)現(xiàn),我們再總結(jié)一下一個通用的興趣Feed需要考慮哪些方面。
整體邏輯
整體邏輯上,一個興趣Feed邏輯結(jié)構(gòu)大致如圖8所示。

圖8 興趣Feed整體邏輯
數(shù)據(jù)模型
Feed這種形式又叫做Activity Stream。顧名思義,就是用戶的動作(Activity)形成的數(shù)據(jù)流(Stream)。
Feed的基本數(shù)據(jù)有三個:用戶(User)、動態(tài)(Activity)和關(guān)系(Connection)。
表達(dá)用戶動態(tài)(Activity)的元素有相應(yīng)的規(guī)范,叫做Atom,可以參考它,并結(jié)合產(chǎn)品需求,定義出自己的Feed數(shù)據(jù)模型。根據(jù)Atom的定義,一條動態(tài)包含以下元素:
- Time:發(fā)生的時(shí)間。
- Actor:由誰發(fā)出的?通常Actor就是用戶ID,但是我們也可以擴(kuò)展到其它擬人化物體上,如關(guān)注的一個“店鋪”、收藏的一部“電影”。
- Verb:動詞,動態(tài)核心是哪一個動作?比如“follow”、“like”等。
- Object:動作作用到最主要的對象,只能有一個。
- Target:動作的最終目標(biāo),與verb有關(guān),可以沒有。它對應(yīng)英語中介詞to后接的事物,比如“John saved a movie to his wishlist”(John保存了一部電影到清單里),這里電影就是Object,而清單就是Target。
- Title:動態(tài)的標(biāo)題,自然語言描述。
- Summary:通常是一小段HTML代碼,是對這個Activity的描述,還可能包含類似縮略圖這樣的可視化元素,可以理解為Activity的view,不是必須的。
舉個例子: 2016年5月6日23:51:01(Time)@刑無刀(Actor)分享了(Verb) 一條微博(Object)給 @ResysChina(Target)。Title就是前面這句話去掉括號后的內(nèi)容,Summary暫略。
關(guān)系即連接。互聯(lián)網(wǎng)產(chǎn)品里處處皆連接,有強(qiáng)有弱,好友關(guān)系、關(guān)注關(guān)系等社交是較強(qiáng)的連接,還有點(diǎn)贊、收藏、評論、瀏覽,這些動作都可以認(rèn)為用戶和另一個對象之間建立了連接。有了連接,就有Feed的傳遞和發(fā)布。
定義一個連接的元素有:
- from: 連接的發(fā)起方。
- to:被連接方。
- type/name: 連接的類型/名字、關(guān)注、加好友、點(diǎn)贊、瀏覽、評論等。
- affinity:連接的強(qiáng)弱。
如果把建立一個連接也視為一個Atom模型的話,from就對應(yīng)其中的Actor,to就對應(yīng)其中的Object。
連接的發(fā)起從from到to,動態(tài)的流動從to到from。連接和動態(tài)是相互加強(qiáng)的,類似蛋和雞的關(guān)系:有了動態(tài),就會產(chǎn)生新的連接;有了新的連接,就可以喂(Feed)給你更多的動態(tài)內(nèi)容。
發(fā)布新動態(tài)
用戶登錄/刷新后,F(xiàn)eed是怎么產(chǎn)生的?內(nèi)容出現(xiàn)在受眾的Feed中,這個過程稱為Fan-out。
我們的直覺上是這樣實(shí)現(xiàn)的:
- 獲取用戶所有連接的終點(diǎn)(如好友或者關(guān)注對象)。
- 獲取這些連接終點(diǎn)(關(guān)注對象)產(chǎn)生的新內(nèi)容(Activity)。
- 排序后輸出。

圖9 拉模式產(chǎn)生內(nèi)容
這就是行話說的拉模式(Fan-out-on-load),F(xiàn)eed是在用戶登錄/刷新后實(shí)時(shí)產(chǎn)生的。
拉模式的好處如下:
- 實(shí)現(xiàn)簡單直接:一行SQL就搞定了。
- 實(shí)時(shí):內(nèi)容產(chǎn)生了,受眾只要刷新就看得見。
但是也存在不足:
- 隨著連接數(shù)的增加,這個操作的復(fù)雜度是指數(shù)級增加的,顯然不可取。
- 內(nèi)存中要保留每個人的產(chǎn)生的內(nèi)容。
- 服務(wù)很難做到高可用。
與拉模式對應(yīng)的,還有一個推模式(Fan-out-on-write)。

圖10 推模式產(chǎn)生內(nèi)容
當(dāng)一個用戶(Actor)產(chǎn)生了一條Activity后,不管受眾是否刷新,立即將這條內(nèi)容推送給相應(yīng)的用戶(和這個Actor建立了連接的人),系統(tǒng)為每一個用戶單獨(dú)開辟一個Feed存儲區(qū)域,用于接收推送的內(nèi)容。當(dāng)用戶登錄后,系統(tǒng)只需要讀取他自己的Feed即可。
推模式的好處顯而易見:在用戶訪問自己的Feed時(shí),幾乎沒有任何復(fù)雜的查詢操作,所以服務(wù)可用性較高。