常用社交网络(SNS、人人网、新浪微博)动态新闻(feed、新鲜事、好友动态)系统浅析
http://blog.renren.com/GetEntry.do?id=781732878&owner=232930872
最近見幾個朋友都在說人人網(wǎng)新鮮事排序的問題,恰巧對這方面也較感興趣,于是打算順便把手頭收集到的資料梳理學(xué)習(xí)一下。由于本人也只是新手,很多內(nèi)容僅僅是參閱資料后的個人猜測與紙上談兵故難免存有錯誤與紕漏,感謝大家指正。
一、 什么是feed
“Feed,本意是“飼料、飼養(yǎng)、(新聞的)廣播等”,RSS訂閱的過程中會用到的“Feed”,便是在這個意義上進(jìn)行引申,表示這是用來接收該信息來源更新的接口。”----摘自百度百科。
? ? ? 要說嚴(yán)格的feed定義與解釋又得吧啦吧啦說一大堆無趣的話,通俗點說feed系統(tǒng)就是當(dāng)你登陸進(jìn)對應(yīng)網(wǎng)站后:閱讀器收到的一篇篇新文章、人人網(wǎng)上看到的一件件新鮮事、新浪微博上推到你面前的一條條新圍脖、QQ空間中好友的一樁樁新動態(tài)等等。
二、 怎樣得到feed
? ? ? feed的獲取方式主要有兩種:push(推)以及pull(拉),簡單說來正如他們字面意思一樣。
? ? ? push就是當(dāng)一條feed產(chǎn)生后交到分發(fā)器,它再去查找用戶關(guān)系明確出誰應(yīng)該看到這條feed,再push到這些用戶的feed列表中(新鮮事、好友動態(tài)),用手機(jī)短信來比喻的話就是收件箱里存收到的feed,發(fā)件箱里存發(fā)出的feed,產(chǎn)生一條feed就是把它“推”到所有粉絲或好友的收件箱中,而查看的話直接訪問自己的收件箱就OK,我們可以明顯地看到這種情況下通過前置計算(或者叫offline computation)提前準(zhǔn)備好用戶的feed信息,在取數(shù)據(jù)時無需多余的計算開銷;但相反在分發(fā)的過程中會產(chǎn)生大量的計算,尤其是類似于姚晨這種的明星級人物(1400多萬的粉絲真的不是開玩笑)發(fā)送一條圍脖會產(chǎn)生巨大的數(shù)據(jù)分發(fā)量(新浪微薄的具體解決方案貌似是異步發(fā)送,具體方案超出本文范圍,感興趣的同學(xué)可以去看TimYang的博客看看)。總體來說push的特征是取輕、發(fā)重。使用push方式發(fā)送的例圖如下所示:
圖2-1 push發(fā)feed例圖
? ? ? pull則相反,當(dāng)一個用戶登錄到網(wǎng)站后,業(yè)務(wù)邏輯系統(tǒng)會到feed列表里去查找用戶應(yīng)該看到的feed,用戶的feed渲染系統(tǒng)再把它們pull出來。還是手機(jī)短信的例子,pull中發(fā)表feed就是把它存入自己的發(fā)件箱,用戶查看feed的時候就去讀取所有關(guān)注對象的發(fā)件箱把內(nèi)容“拉”進(jìn)自己的收件箱。“拉”方案的優(yōu)點是隨需計算(或者叫 online computation)節(jié)約存儲空間,但相對的缺點也很明顯過大的計算量影響feed數(shù)據(jù)的讀取速度,尤其是峰值時段(新浪的號稱1億多用戶可不是開玩笑的),相對于push來說pull的特征是取重、發(fā)輕。使用pull方式取的例圖如下所示:
圖2-2 pull模式取feed例圖
? ? ? 針對push和pull的優(yōu)缺點,實際項目中一般采用混合模式。發(fā)布的時候push給熱點用戶,再把feed存入熱點cache當(dāng)沒收到push的用戶登陸后可以到cache里快速pull出相關(guān)feed;用戶可以先收到push的新feed消息,當(dāng)想看以前的消息時再去pull出相關(guān)的feed。
三、 如何表示feed
? ? ? ?每個平臺有各式各樣的feed消息,考慮到feed消息最終會展示到平臺自身、擴(kuò)展應(yīng)用以及客戶端上,所以對feed格式統(tǒng)一成某種規(guī)范而不是發(fā)布者隨意輸出最終展示的文字。同時對圖片、視頻以及連接等都統(tǒng)一定義。Facebook的實現(xiàn)方式是這樣的:
- feed是自描述的,即它不是由生產(chǎn)者決定最終格式,也不是前端決定。而是通過template機(jī)制來進(jìn)行。
- template在平臺中可以由開發(fā)者注冊,注冊時需要定義字段及最終展示樣式,如
“{*actor*}?在***游戲中升到 {*credit*}?級”
- 發(fā)布的feed內(nèi)容僅包含字段數(shù)據(jù),也就是變量的值,json格式。
“{"credit": "80"}”
- 前端需要顯示feed時候調(diào)用feed模板,再替換字段得到feed內(nèi)容
“Tim?在***游戲中升到 80?級”
- 模板需要定義兩個,模板標(biāo)題及模板內(nèi)容(展示feed詳細(xì)內(nèi)容),前端根據(jù)需要決定只顯示標(biāo)題還是全部都顯示。
- ?“target”,?“actor”是系統(tǒng)保留字段,代表目標(biāo)對象和當(dāng)前用戶,{*actor*}必須放在模板標(biāo)題開始位置。
- “images”,?“flash”,?“mp3″,?“video”?是系統(tǒng)保留字段,無需在模板中定義。但這些內(nèi)容只會在詳細(xì)feed界面輸出。即只要feed內(nèi)容里面有這個字段值,界面就會自動顯示。
- facebook文檔中沒有規(guī)定feed長度限制。
- 每個開發(fā)者最多只能注冊100個模板。
四、 有效組織feed信息
? ? ? 現(xiàn)在的網(wǎng)絡(luò)是信息大爆炸的展示場,為了避免讓用戶淹沒在雜亂的feed海洋中,如何有效組織這些feed信息就是各大平臺技術(shù)較量的一大戰(zhàn)場,當(dāng)平臺在后臺為用戶準(zhǔn)備好了屬于他的原始feed信息后,當(dāng)然各家平臺針對自己業(yè)務(wù)的特點會有不同的方案,但大致都要經(jīng)過以下幾個步驟才能變成最終展示給用戶的形態(tài):
1、?? 聚合:
? ? ? ?根據(jù)feed信息的訪問頻率可能會存在不同的服務(wù)器存儲區(qū)域中。借用淘寶網(wǎng)核心系統(tǒng)專家余峰對各存儲區(qū)與讀書的比喻加以修改就是:
? ? ? ?“CPU訪問L0就像是你讀手邊的一本書,訪問L1就像從書桌拿一本書,L2是從書架拿一本書,L3是從客廳桌子上拿一本書,訪問主存就像騎車去社區(qū)圖書館拿一本書。”
以下圖新浪微博cache設(shè)計圖為例:
圖4-1、新浪微博cache結(jié)構(gòu)圖
? ? ? ?feed信息依據(jù)自身特性分布于各級存儲中,必須要把他們匯聚到一起。匯聚并不單純只是不同級別存儲位置的匯聚,還有牽扯到業(yè)務(wù)數(shù)據(jù)的匯聚,比如來自不同feed信息源的匯聚如:來自平臺本身,開放應(yīng)用,第三方外部網(wǎng)站等業(yè)務(wù)流的匯聚。
2、?? 去重
? ? ? 很多時候有些feed信息是有重復(fù)性的,比如A發(fā)表了一篇日志,他的好友B和C看后很喜歡選擇分享。當(dāng)這條feed如果出現(xiàn)在B與C的共同好友里就會出現(xiàn)重復(fù)feed信息。面對這個問題不同的社交平臺針對自己的業(yè)務(wù)類型選擇了不同的處理方式,即使是同一個平臺也在對這種行為采取了不同的應(yīng)對策略。經(jīng)過簡單測試后猜測結(jié)果:
? ? ? ? ? ? ? ? ? ? ? ? ? ?表4-1 不同平臺feed去重說明
|
平臺名稱 |
說明 |
|
|
新浪微博 |
基于微薄輕傳播媒體理論,不覆蓋重復(fù)的分享feed記錄下分享傳輸?shù)能壽E |
|
|
人人網(wǎng) |
早期 |
不處理重復(fù)分享,單純按時間排序feed,時間早的自然在feed列表中淘汰 |
|
曾經(jīng) |
消除重復(fù)feed信息,只顯示最新一條,但在feed信息的下方顯示擁有相似分享的連接,點這里可以看到其他的相似分享以及消重的個數(shù) |
|
|
現(xiàn)在 |
有選擇的處理重復(fù)分享,按現(xiàn)有高級排序方法對feed排序 |
|
|
QQ空間 |
舊版 |
不處理重復(fù)分享,根據(jù)舊版匯聚在一個大的用戶最新動態(tài)之中 |
|
新版 |
不處理重復(fù)分享,根據(jù)新版方式排序在feed列表里 |
|
經(jīng)過測試發(fā)現(xiàn):
? ? ? ?對于新浪微博來說由于他的定位是一種媒體工具,所以關(guān)注的點是信息的傳輸,故而并未太注重去重的分析。他只是單純的記錄信息傳輸過程新產(chǎn)生的信息,可以說針對同一條信息每一次不同人的轉(zhuǎn)發(fā)都是在完善這條媒體信息。
? ? ? ?人人網(wǎng)由于是這里面最純粹的社交網(wǎng)絡(luò),饋贈型經(jīng)濟(jì)驅(qū)動下的社交網(wǎng)絡(luò)更關(guān)注的是如何產(chǎn)生分享這一行為,如何激勵用戶的互動是他首要關(guān)注的目標(biāo)。因而我們可以看出人人網(wǎng)對于去重的技術(shù)關(guān)注較其他平臺更深,其自身去重的方法也在不斷修改,一開始確實是沒有關(guān)注到相關(guān)問題,在用戶數(shù)量增加后,對于一些熱點分享就會出現(xiàn)很嚴(yán)重的重復(fù)feed,當(dāng)用戶登陸網(wǎng)站會發(fā)現(xiàn)排在feed列表前的都是重復(fù)的熱點信息。針對這點人人推出了消除重復(fù)feed的功能,將許多相似分享合并到一個feed中只顯示最新的分享條目。但這樣一來有些用戶發(fā)現(xiàn)自己分享的東西,只能在好友feed中生存一小段時間,一旦有共同好友也分享這條信息就會覆蓋掉自己的分享。這樣一來用戶的分享不能被其他人完全看到,抑制了饋贈型經(jīng)濟(jì)的產(chǎn)生條件。好在之后隨著推薦引擎的技術(shù)發(fā)展解決了這個問題,人人網(wǎng)feed排序方式的改進(jìn),完全可以避免熱點信息重復(fù)出現(xiàn)在feed列表的前面,而且可以有針對性的將你的分享自動投遞到你期望的讀者面前,具體的排序方案在下一節(jié)會詳細(xì)分析。
? ? ? QQ空間作為騰訊QQ IM的一個擴(kuò)展并不算一個純粹的社交分享型網(wǎng)絡(luò),他只是完善QQ IM不能觸及的一些方面,使用戶更加全面的了解IM交流的對象。他更像是一個用戶的展示平臺,所以重復(fù)分享現(xiàn)象在QQ空間中并不嚴(yán)重。QQ空間最主要的展示內(nèi)容都是圍繞著該用戶的一些信息故不太會經(jīng)常產(chǎn)生過度重復(fù)的分享內(nèi)容。
? ? ? 從趨勢上看隨著排序算法更加智能化的發(fā)展,重復(fù)的熱點消息問題會得到更有的解決。
3、?? 排序
? ? ? ?feed排序算法可以說是SNS發(fā)展最重要的技術(shù)之一,也是各家平臺的核心技術(shù)。由于看過的相關(guān)資料較少,以下的一些分析僅僅是個人紙上談兵的一點淺析,歡迎大家指正。
不同平臺有著不同的排序方案(經(jīng)測試和個人使用總結(jié)):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?表4-2 不同平臺排序說明
|
平臺名稱 |
說明 |
|
|
新浪微博 |
單純按照feed發(fā)生時間排序 |
|
|
人人網(wǎng) |
早期 |
按feed發(fā)布時間順序排序 |
|
曾經(jīng) |
有段時間相冊是按最后評論時間排序 |
|
|
現(xiàn)在 |
綜合的推薦引擎方式排序 |
|
|
QQ空間 |
舊版 |
將用戶最近feed信息框入一個大的feed中,按用戶最新動態(tài)時間對這個大feed整體排序 |
|
新版 |
類似于新浪微薄的單純按照feed發(fā)生時間排序 |
|
? ? ? ?如前所述由于新浪微薄的定位是媒體功能,所以它的時效性要求較高。再加上原來140個字的限制都表明他輕量級的信息定位應(yīng)該更專心于時效性,故新浪采取產(chǎn)生時間排序無可厚非,微博的原理是假設(shè)有價值的微博會不斷被轉(zhuǎn)發(fā)從而反復(fù)出現(xiàn)在用戶的feed列表中,但這種方法也產(chǎn)生了微博的“15分鐘定理”——如果一條微博在最初的15分鐘內(nèi)沒有被大量關(guān)注與轉(zhuǎn)發(fā)則它會被汪洋“博”海所淹沒,最終傳播不了多遠(yuǎn)。根據(jù)長尾理論可能存在一些小型的細(xì)分用戶群體話題存在,于是一些有價值的微博由于初期沒有被發(fā)現(xiàn),或是作者的粉絲過少,都有可能導(dǎo)致作品無法傳播開去。個人預(yù)測新浪也可能會引入推薦引擎系統(tǒng),通過對用戶興趣和微博數(shù)據(jù)庫的深度數(shù)據(jù)挖掘進(jìn)行微博推薦,在時間單維排序的基礎(chǔ)上加入興趣維度。
? ? ? ?單看國內(nèi)SNS人人網(wǎng)現(xiàn)在的排序系統(tǒng)貌似是最復(fù)雜的(facebook的算法智能與變態(tài)程度就不考慮了)。根據(jù)人人網(wǎng)張鐵安在《程序員》與CSDN舉辦的TUP第二期上的演講以及個人使用情況來看,首先人人網(wǎng)會對用戶的資料和行為進(jìn)行挖掘然后按興趣分類生成興趣向量,再根據(jù)用戶與好友的互動行為挖掘生成社會關(guān)系向量。當(dāng)一條feed由好友產(chǎn)生了會挖掘這條消息的興趣分類向量,該分類向量與你的興趣分類向量計算距離得到興趣權(quán)值,再通過作者與你的社交向量做計算得出關(guān)系權(quán)值。最終一條feed的排序權(quán)值會來自于最少以下幾個方面【生成時間、消息熱度(最近活躍程度)、興趣權(quán)值、關(guān)系權(quán)值、商業(yè)權(quán)值】。其中商業(yè)權(quán)值應(yīng)該是針對一些商業(yè)推廣活動類feed,比如說你參加了在人人網(wǎng)做廣告的某些活動,系統(tǒng)會將這條feed發(fā)送給你的好友面前,可能根據(jù)廣告主付錢多少采取不同的權(quán)值會在好友的feed列表前面排列很久。
? ? ? ?QQ空間在前面已經(jīng)分析過是針對QQ IM的一個拓展,他的核心是展示用戶信息平臺,所以他較老版本的排序是以某一用戶的最新動態(tài)排序,然后將該用戶最近的動態(tài)打包合并到一個大的feed中向用戶展示。他的核心是針對于一個用戶的信息產(chǎn)生的。在新版QQ空間中可能是為了和面向媒體的騰訊微博以及面向社交的朋友網(wǎng)進(jìn)行整合,修改成面對單一每條feed的排序。
? ? ? ?總體來說SNS由于業(yè)務(wù)類型的不同,各個平臺針對產(chǎn)生feed的這一行為的關(guān)注點各有不同,進(jìn)而導(dǎo)致了排序行為的不同。新浪微博這種媒體平臺關(guān)注的是feed本身的內(nèi)容以及由轉(zhuǎn)發(fā)與評論引出的新內(nèi)容;人人網(wǎng)這種純粹社交網(wǎng)絡(luò)關(guān)注的是由feed內(nèi)容引發(fā)的用戶間的互動行為;而QQ空間這種應(yīng)為是輔助與其他產(chǎn)品的工具,所以他關(guān)注的是被輔助的產(chǎn)品自身所需求的特點。
4、?? 渲染
? ? ? ?渲染階段比較易于理解,通過第三部分的描述我們了解到feed最初是由變量名與變量值組成的,渲染就是通過將feed套入對應(yīng)模版并依據(jù)之前幾個步驟經(jīng)過聚合、去重、排序后的結(jié)果最終生成為用戶所看到的feed列表。
五、 架構(gòu)簡介
? ? ? ?這部分只是簡單給大家展示下新浪和人人網(wǎng)的系統(tǒng)架構(gòu),具體技術(shù)和原理個人還正在學(xué)習(xí)中(就不說出來丟人了)
新浪微博的功能性架構(gòu)圖如下所示:
? ? ? ? ? ? ? ? ? ? ? ? 圖5-1 新浪微博功能架構(gòu)
? ? ? ?這個是新浪微博的第三代架構(gòu)圖了,首先在最底層是實現(xiàn)一些存儲同步等基礎(chǔ)性需求。再上面是平臺面向業(yè)務(wù)的服務(wù)與提供應(yīng)用的服務(wù),最上層是作為第三方開發(fā)的API提供給app開發(fā)者。
其系統(tǒng)架構(gòu)如下圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖5-2 微博系統(tǒng)架構(gòu)
? ? ? ?具體技術(shù)方案我自己也在學(xué)習(xí)中,這里就不再多說了(就不出來丟人了…),有興趣大家一起探討學(xué)習(xí)吧。
人人網(wǎng)系統(tǒng)架構(gòu)圖:
? ? ? ? ? ? ? ? ? ? ? ? ?圖5-3 人人網(wǎng)feed系統(tǒng)架構(gòu)圖
? ? ? ?簡單說一下這圖,笑臉表示某個用戶很開心寫了篇日志,是先交給分發(fā)器(Dispatcher),經(jīng)過一些處理后發(fā)往三個不同的地方,第一個是newsfeed這是完整的一個feed信息與索引;第二個是minifeed這是一個feed的短摘要信息,你在人人網(wǎng)上看到的某個用戶寫了篇日志的新鮮事,在它的標(biāo)題下面會有一小段摘要,這個短摘要就是minifeed;第三是要把新鮮事本身cache起來,會把feed發(fā)到集群里面最后進(jìn)行存儲持久化。
六、 總結(jié)
? ? ? ?好久沒寫這么長篇的東西了,終于寫完了。由于個人水平有限系統(tǒng)架構(gòu)部分寫的有點略顯薄弱,歡迎大家一起討論,爭取以后有機(jī)會把這部分單獨完善重寫一篇。
總結(jié)
以上是生活随笔為你收集整理的常用社交网络(SNS、人人网、新浪微博)动态新闻(feed、新鲜事、好友动态)系统浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬件厂商 Linux社区 代码,Linu
- 下一篇: 腾讯首席战略官詹姆斯: 从互联网信息的永