一、微博feed系統(tǒng)的推模式架構(gòu)
1、發(fā)布服務(wù)
負(fù)責(zé)生成用戶(hù)的消息,將消息推送到數(shù)據(jù)發(fā)布中心。
2、推送服務(wù)
在接收到新消息后,根據(jù)消息的類(lèi)型和內(nèi)容信息進(jìn)行用戶(hù)匹配,向用戶(hù)推送個(gè)性化的消息流。
3、數(shù)據(jù)發(fā)布中心
接收發(fā)布服務(wù)推送的消息,將消息進(jìn)行轉(zhuǎn)換、去重和分級(jí)處理,同時(shí)創(chuàng)建索引,為后續(xù)的消息處理提供支持。
4、移動(dòng)終端
接收用戶(hù)推送的消息流。
二、微博feed系統(tǒng)的拉模式架構(gòu)
1、消息查詢(xún)服務(wù)
提供消息查詢(xún)接口,支持按時(shí)間線(xiàn)查詢(xún)消息。
2、推送服務(wù)
維護(hù)用戶(hù)的消息流,當(dāng)有新的消息到達(dá)或舊的消息需要更新時(shí),會(huì)將更新后的消息推送到用戶(hù)的消息流中。
3、移動(dòng)終端
根據(jù)用戶(hù)請(qǐng)求,向消息查詢(xún)服務(wù)發(fā)送查詢(xún)請(qǐng)求,通過(guò)推送服務(wù)獲取需要展示的消息。
三、Feed系統(tǒng)介紹
1、簡(jiǎn)介
當(dāng)互聯(lián)網(wǎng)開(kāi)始進(jìn)入移動(dòng)互聯(lián)網(wǎng)時(shí)代,具代表性的產(chǎn)品就是微博、微信,以及后來(lái)的今日頭條、快手等。這些移動(dòng)互聯(lián)網(wǎng)時(shí)代的新產(chǎn)品在過(guò)去幾年間借著智能手機(jī)的風(fēng)高速成長(zhǎng)。這些產(chǎn)品都是Feed流類(lèi)型產(chǎn)品,由于Feed流一般是按照時(shí)間“從上往下流動(dòng)”,非常適合在移動(dòng)設(shè)備端瀏覽,最終這一類(lèi)應(yīng)用就脫穎而出,迅速搶占了上一代產(chǎn)品的市場(chǎng)空間。
Feed流是Feed+流,F(xiàn)eed的本意是飼料,F(xiàn)eed流的本意就是有人一直在往一個(gè)地方投遞新鮮的飼料,如果需要飼料,只需要盯著投遞點(diǎn)就可以了,這樣就能源源不斷獲取到新鮮的飼料。在信息學(xué)里面,F(xiàn)eed其實(shí)是一個(gè)信息單元,比如一條朋友圈狀態(tài)、一條微博、一條咨詢(xún)或一條短視頻等,所以Feed流就是不停更新的信息單元,只要關(guān)注某些發(fā)布者就能獲取到源源不斷的新鮮信息,我們的用戶(hù)也就可以在移動(dòng)設(shè)備上逐條去瀏覽這些信息單元。
當(dāng)前最流行的Feed流產(chǎn)品有微博、微信朋友圈、頭條的資訊推薦、快手抖音的視頻推薦等,還有一些變種,比如私信、通知等,這些系統(tǒng)都是Feed流系統(tǒng),接下來(lái)我們會(huì)介紹如何設(shè)計(jì)一個(gè)Feed流系統(tǒng)架構(gòu)。
2、Feed流系統(tǒng)特點(diǎn)
Feed流本質(zhì)上是一個(gè)數(shù)據(jù)流,是將 “N個(gè)發(fā)布者的信息單元” 通過(guò) “關(guān)注關(guān)系” 傳送給 “M個(gè)接收者”。
3、Feed流系統(tǒng)的數(shù)據(jù)
Feed流系統(tǒng)是一個(gè)數(shù)據(jù)流系統(tǒng),所以我們核心要看數(shù)據(jù)。從數(shù)據(jù)層面看,數(shù)據(jù)分為三類(lèi),分別是:
發(fā)布者的數(shù)據(jù):發(fā)布者產(chǎn)生數(shù)據(jù),然后數(shù)據(jù)需要按照發(fā)布者組織,需要根據(jù)發(fā)布者查到所有數(shù)據(jù),比如微博的個(gè)人頁(yè)面、朋友圈的個(gè)人相冊(cè)等。關(guān)注關(guān)系:系統(tǒng)中個(gè)體間的關(guān)系,微博中是關(guān)注,是單向流,朋友圈是好友,是雙向流。不管是單向還是雙向,當(dāng)發(fā)布者發(fā)布一條信息時(shí),該條信息的流動(dòng)永遠(yuǎn)是單向的。接收者的數(shù)據(jù):從不同發(fā)布者那里獲取到的數(shù)據(jù),然后通過(guò)某種順序(一般為時(shí)間)組織在一起,比如微博的首頁(yè)、朋友圈首頁(yè)等。這些數(shù)據(jù)具有時(shí)間熱度屬性,越新的數(shù)據(jù)越有價(jià)值,越新的數(shù)據(jù)就要排在最前面。針對(duì)這三類(lèi)數(shù)據(jù),我們可以有如下定義:
存儲(chǔ)庫(kù):存儲(chǔ)發(fā)布者的數(shù)據(jù),永久保存。關(guān)注表:用戶(hù)關(guān)系表,永久保存。同步庫(kù):存儲(chǔ)接收者的時(shí)間熱度數(shù)據(jù),只需要保留最近一段時(shí)間的數(shù)據(jù)即可。4、排序
目前的Feed流系統(tǒng)中的排序方式有兩種,一種是時(shí)間,一種是分?jǐn)?shù)。我們常用的微博、朋友圈、私信這些都是時(shí)間線(xiàn)類(lèi)型的,因?yàn)檫@些產(chǎn)品定義中,需要我們主動(dòng)關(guān)注某些人后才會(huì)看到這些人發(fā)表的內(nèi)容,這個(gè)時(shí)候,最重要的是實(shí)時(shí)性,而不是發(fā)布質(zhì)量,就算關(guān)注人發(fā)布了一條垃圾信息,我們也會(huì)被動(dòng)看到。這種類(lèi)型的產(chǎn)品適用于按照時(shí)間線(xiàn)排序。這一篇我們介紹的架構(gòu)都是基于時(shí)間類(lèi)型的。
另外一種是不需要關(guān)注任何人,我們能看到的都是系統(tǒng)希望我們看到的,系統(tǒng)在后臺(tái)會(huì)分析我們的每個(gè)人的愛(ài)好,然后給每個(gè)人推送差異化的、各自喜歡的內(nèi)容,這一種的架構(gòu)和基于時(shí)間的完全不一樣,我們?cè)诤罄m(xù)的推薦類(lèi)型中專(zhuān)門(mén)介紹。
延伸閱讀1:如何刪除Feed內(nèi)容
在Feed流應(yīng)用中有一個(gè)問(wèn)題,就是如果用戶(hù)刪除了之前發(fā)表的內(nèi)容,系統(tǒng)該如何處理?因?yàn)橄到y(tǒng)里面有寫(xiě)擴(kuò)散,那么刪除的時(shí)候是不是也要寫(xiě)擴(kuò)散一遍?這樣的話(huà),刪除就不及時(shí)了,很難應(yīng)對(duì)法律法規(guī)要求的快速刪除。針對(duì)這個(gè)問(wèn)題,我們?cè)谥霸O(shè)計(jì)的時(shí)候,同步表中只有消息ID,沒(méi)有消息內(nèi)容,在用戶(hù)讀取的時(shí)候需要到存儲(chǔ)庫(kù)中去讀消息內(nèi)容,那么我們可以直接刪除存儲(chǔ)庫(kù)中的這一條消息,這樣用戶(hù)讀取的時(shí)候使用消息ID是讀不到數(shù)據(jù)的,也就相當(dāng)于刪除的內(nèi)容,而且刪除速度會(huì)很快。除了直接刪除外,另外一種辦法是邏輯刪除,對(duì)于刪除的feed內(nèi)容,只做標(biāo)記,當(dāng)查詢(xún)到帶有標(biāo)記的數(shù)據(jù)時(shí)就認(rèn)為刪除了。