- 新浪新聞評(píng)論系統(tǒng)的架構(gòu)演進(jìn)和經(jīng)驗(yàn)總結(jié)

(原文刊登于程序員雜志2014年12期,限于篇幅有刪節(jié),此處為無(wú)碼完整多圖版)

新聞門(mén)戶網(wǎng)站的評(píng)論系統(tǒng),或者稱為跟帖、留言板,是所有門(mén)戶網(wǎng)站的核心標(biāo)" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢 在線咨詢
18143453325 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 門(mén)戶級(jí)UGC系統(tǒng)的技術(shù)進(jìn)化路線

門(mén)戶級(jí)UGC系統(tǒng)的技術(shù)進(jìn)化路線

時(shí)間:2022-08-23 18:06:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2022-08-23 18:06:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)

門(mén)戶級(jí)UGC系統(tǒng)的技術(shù)進(jìn)化路線

- 新浪新聞評(píng)論系統(tǒng)的架構(gòu)演進(jìn)和經(jīng)驗(yàn)總結(jié)

(原文刊登于程序員雜志2014年12期,限于篇幅有刪節(jié),此處為無(wú)碼完整多圖版)

新聞門(mén)戶網(wǎng)站的評(píng)論系統(tǒng),或者稱為跟帖、留言板,是所有門(mén)戶網(wǎng)站的核心標(biāo)準(zhǔn)服務(wù)組件之一。與論壇、博客等其他互聯(lián)網(wǎng)UGC系統(tǒng)相比,評(píng)論系統(tǒng)雖然從產(chǎn)品功能角度衡量相對(duì)簡(jiǎn)單,但是因?yàn)樾枰軌蛟谕话l(fā)熱點(diǎn)新聞事件時(shí),在沒(méi)有任何預(yù)警和準(zhǔn)備的前提下支撐住短短幾分鐘內(nèi)上百倍甚至更高的訪問(wèn)量暴漲,而評(píng)論系統(tǒng)既無(wú)法像靜態(tài)新聞內(nèi)容業(yè)務(wù)那樣通過(guò)CDN和反向代理等中間緩存手段化解沖擊,也不可能在平時(shí)儲(chǔ)備大量冗余設(shè)備應(yīng)對(duì)突發(fā)新聞,所以如何在有限的設(shè)備資源條件下提升系統(tǒng)的抗壓性和伸縮性,也是對(duì)一個(gè)貌似簡(jiǎn)單的UGC系統(tǒng)的不小考驗(yàn)。

(圖0:2008年劉翔因傷退賽后的每分鐘系統(tǒng)發(fā)帖量曲線)

本人曾負(fù)責(zé)新浪網(wǎng)評(píng)論系統(tǒng)多年,新浪評(píng)論系統(tǒng)不僅服務(wù)于新浪的門(mén)戶新聞業(yè)務(wù),還包括簽名、調(diào)查、辯論、投票等產(chǎn)品,我經(jīng)歷了系統(tǒng)從單機(jī)到多機(jī)再到集群,從簡(jiǎn)單到復(fù)雜再回歸簡(jiǎn)單,從突發(fā)熱點(diǎn)事件時(shí)經(jīng)常宕機(jī)到后來(lái)承受與新浪新聞靜態(tài)池(新浪新聞業(yè)務(wù)的全國(guó)性內(nèi)容分發(fā)與緩存系統(tǒng))相近流量壓力的架構(gòu)演變過(guò)程,負(fù)責(zé)了前后多個(gè)版本的設(shè)計(jì)和開(kāi)發(fā)工作。有心得收獲也有經(jīng)驗(yàn)教訓(xùn),摘要總結(jié)一下供各位同行批評(píng)和參考。

另外我也希望能看到各位同行更多的經(jīng)驗(yàn)分享,在互聯(lián)網(wǎng)系統(tǒng)架構(gòu)設(shè)計(jì)領(lǐng)域,失敗遠(yuǎn)比成功更寶貴。

【新聞評(píng)論系統(tǒng)的起源】

新浪網(wǎng)很早就在新聞中提供了評(píng)論功能,最開(kāi)始是使用Perl語(yǔ)言開(kāi)發(fā)的簡(jiǎn)單腳本,目前能找到的最早具備評(píng)論功能的新聞是2000年4月7日的(鏈接見(jiàn)附錄),經(jīng)過(guò)多次系統(tǒng)升級(jí),14年前的評(píng)論地址已經(jīng)失效了,但是數(shù)據(jù)仍保存在數(shù)據(jù)庫(kù)中。直到今天,評(píng)論仍是國(guó)內(nèi)所有新聞網(wǎng)站的標(biāo)配功能。

【評(píng)論系統(tǒng)3.0】

大約2003年左右,我接手負(fù)責(zé)評(píng)論系統(tǒng),系統(tǒng)版本3.0。當(dāng)時(shí)的評(píng)論系統(tǒng)運(yùn)行在單機(jī)環(huán)境,一臺(tái)X86版本Solaris系統(tǒng)的Dell 6300服務(wù)器提供了全部服務(wù),包括MySQL和Apache,以及所有前后臺(tái)CGI程序,使用C++開(kāi)發(fā)。

(圖1:3.0系統(tǒng)流程和架構(gòu))

3.0系統(tǒng)的緩存模塊設(shè)計(jì)的比較巧妙,以顯示頁(yè)面為單位緩存數(shù)據(jù),因?yàn)樵u(píng)論頁(yè)面是依照提交時(shí)間降序排列,每新增一條新評(píng)論,所有帖子都需要向下移動(dòng)一位,所以緩存格式設(shè)計(jì)為每?jī)身?yè)數(shù)據(jù)一個(gè)文件,前后相鄰的兩個(gè)文件有一頁(yè)的數(shù)據(jù)重復(fù),最新的緩存文件通常情況下不滿兩頁(yè)數(shù)據(jù)。

(圖2:頁(yè)面緩存算法示意圖)

上圖是假設(shè)評(píng)論總數(shù)95條,每頁(yè)顯示20條時(shí)的頁(yè)面緩存結(jié)構(gòu),此時(shí)用戶看到的第一頁(yè)數(shù)據(jù)讀取自“緩存頁(yè)4”的95~76,第二頁(yè)數(shù)據(jù)讀取自緩存頁(yè)3的75~56,以此類推。

這樣發(fā)帖動(dòng)作對(duì)應(yīng)的緩存更新可以簡(jiǎn)化為一次文件追加寫(xiě)操作,效率最高。而且可以保證任意評(píng)論總量和顯示順序下的翻頁(yè)動(dòng)作,都可以在一個(gè)緩存文件中讀到所需的全部數(shù)據(jù),而不需要跨頁(yè)讀取再合并。缺點(diǎn)是更新評(píng)論狀態(tài)比如刪除時(shí),需要清空自被刪除貼子開(kāi)始的所有后續(xù)緩存文件。緩存模塊采取主動(dòng)+被動(dòng)更新模式,發(fā)帖為主動(dòng)更新,每次發(fā)帖后觸發(fā)一次頁(yè)面緩存追加寫(xiě)操作。更新評(píng)論狀態(tài)為被動(dòng)更新,所涉及緩存頁(yè)面文件會(huì)被清空,直到下一次用戶讀取頁(yè)面緩存時(shí)再連接數(shù)據(jù)庫(kù)完成查詢,然后更新頁(yè)面緩存,以備下次讀取。這個(gè)針對(duì)發(fā)帖優(yōu)化的頁(yè)面緩存算法繼續(xù)沿用到了后續(xù)版本的評(píng)論系統(tǒng)中。

此時(shí)的評(píng)論系統(tǒng)就已經(jīng)具備了將同一專題事件下所有新聞的評(píng)論匯總顯示的能力,在很長(zhǎng)一段時(shí)間內(nèi)這都是新浪評(píng)論系統(tǒng)的獨(dú)有功能。

雖然3.0系統(tǒng)基本滿足了當(dāng)時(shí)的產(chǎn)品需求,但是畢竟是單機(jī)系統(tǒng),熱點(diǎn)新聞時(shí)瞬間涌來(lái)的大量發(fā)帖和讀取操作,經(jīng)常會(huì)壓垮這臺(tái)當(dāng)時(shí)已屬高配的4U服務(wù)器,頻繁顯示資源耗盡的錯(cuò)誤頁(yè)面。我接手后的首要任務(wù)就是盡量在最短時(shí)間內(nèi)最大限度的降低系統(tǒng)的宕機(jī)頻率,通過(guò)觀察分析確定主要性能瓶頸在數(shù)據(jù)庫(kù)層面。

3.0系統(tǒng)里每個(gè)新聞?lì)l道的全部評(píng)論數(shù)據(jù)都保存在一張MyISAM表中,部分頻道的數(shù)據(jù)量已經(jīng)超過(guò)百萬(wàn),在當(dāng)時(shí)已屬海量規(guī)模,而且只有一個(gè)數(shù)據(jù)庫(kù)實(shí)例,讀寫(xiě)競(jìng)爭(zhēng)非常嚴(yán)重。一旦有評(píng)論狀態(tài)更新會(huì)導(dǎo)致很多緩存頁(yè)面失效,瞬間引發(fā)大量數(shù)據(jù)庫(kù)查詢,進(jìn)一步加劇了讀寫(xiě)競(jìng)爭(zhēng)。當(dāng)所有CGI進(jìn)程都阻塞在數(shù)據(jù)庫(kù)環(huán)節(jié)無(wú)法退出時(shí),殃及Apache,進(jìn)而導(dǎo)致系統(tǒng)Load值急劇上升無(wú)法響應(yīng)任何操作,只有重啟才能恢復(fù)。

解決方案是增加了一臺(tái)FreeBSD系統(tǒng)的低配服務(wù)器用于數(shù)據(jù)庫(kù)分流,當(dāng)時(shí)MySQL的版本是3.23,Replication主從同步還未發(fā)布,采取的辦法是每天給數(shù)據(jù)表減肥,把超過(guò)一周的評(píng)論數(shù)據(jù)搬到二號(hào)服務(wù)器上,保證主服務(wù)器的評(píng)論表數(shù)據(jù)量維持在合理范圍,在這樣的臨時(shí)方案下3.0系統(tǒng)又撐了幾個(gè)月。

在現(xiàn)在看來(lái)相當(dāng)簡(jiǎn)陋的系統(tǒng)架構(gòu)下,新浪評(píng)論系統(tǒng)3.0與中國(guó)互聯(lián)網(wǎng)產(chǎn)業(yè)的門(mén)戶時(shí)代一起經(jīng)歷了南海撞機(jī)、911劫機(jī)、非典、孫志剛等新聞事件。

(截圖1~4:南海撞機(jī)、911劫機(jī)事件、非典、孫志剛事件)

【評(píng)論系統(tǒng)4.0啟動(dòng)】

2004年左右,運(yùn)行了近三年的3.0系統(tǒng)已經(jīng)無(wú)法支撐新浪新聞的持續(xù)流量上漲,技術(shù)部門(mén)啟動(dòng)了4.0計(jì)劃,核心需求就是三個(gè)字:不宕機(jī)。

因?yàn)楫?dāng)時(shí)我還負(fù)責(zé)了新浪聊天系統(tǒng)的工作,不得不分身應(yīng)對(duì)新舊系統(tǒng)的開(kāi)發(fā)維護(hù)和其他項(xiàng)目任務(wù),所以在現(xiàn)有評(píng)論系統(tǒng)線上服務(wù)不能中斷的前提下,制定了數(shù)據(jù)庫(kù)結(jié)構(gòu)不變,歷史數(shù)據(jù)全部保留,雙系統(tǒng)逐步無(wú)縫切換,升級(jí)期間新舊系統(tǒng)并存的大方針。

【評(píng)論系統(tǒng)4.0第一階段】

- 文件系統(tǒng)代替數(shù)據(jù)庫(kù),基于ICE的分布式系統(tǒng)

既然3.0系統(tǒng)數(shù)據(jù)庫(kù)結(jié)構(gòu)不可變,除了把數(shù)據(jù)庫(kù)升級(jí)到MySQL 4.0啟用Repliaction分解讀寫(xiě)壓力以外,最開(kāi)始的設(shè)計(jì)重點(diǎn)是如何把數(shù)據(jù)庫(kù)與用戶行為隔離開(kāi)。

解決方案是在MySQL數(shù)據(jù)庫(kù)和頁(yè)面緩存模塊之間,新建一個(gè)帶索引的數(shù)據(jù)文件層,每條新聞的所有評(píng)論都單獨(dú)保存在一個(gè)索引文件和一個(gè)數(shù)據(jù)文件中,期望通過(guò)把對(duì)數(shù)據(jù)庫(kù)單一表文件的讀寫(xiě)操作,分解為文件系統(tǒng)上互不干涉可并發(fā)執(zhí)行的讀寫(xiě)操作,來(lái)提高系統(tǒng)并發(fā)處理能力。在新的索引數(shù)據(jù)模塊中,查詢?cè)u(píng)論總數(shù)、追加評(píng)論、更新評(píng)論狀態(tài)都是針對(duì)性優(yōu)化過(guò)的高效率操作。從這時(shí)候起,MySQL數(shù)據(jù)庫(kù)就降到了只提供歸檔備份和內(nèi)部管理查詢的角色,不再直接承載任何用戶更新和查詢請(qǐng)求了。

同時(shí)引入了數(shù)據(jù)庫(kù)更新隊(duì)列來(lái)緩解數(shù)據(jù)庫(kù)并發(fā)寫(xiě)操作的壓力,因?yàn)楫?dāng)時(shí)消息隊(duì)列中間件遠(yuǎn)不如現(xiàn)在百花齊放,自行實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的文件方式消息隊(duì)列模塊,逐步應(yīng)用到了4.0系統(tǒng)的各個(gè)模塊間異步通信場(chǎng)合中。

(圖3:4.0系統(tǒng)流程)

(圖4:4.0索引緩存結(jié)構(gòu))

選用了ICE作為RPC組件,用于所有的模塊間調(diào)用和網(wǎng)絡(luò)通信,這大概是剛設(shè)計(jì)4.0系統(tǒng)時(shí)唯一沒(méi)做錯(cuò)的選擇,在整個(gè)4.0系統(tǒng)項(xiàng)目生命周期中,ICE的穩(wěn)定性和性能表現(xiàn)從未成為過(guò)問(wèn)題。(Wiki:Internet Communications Engine)

4.0系統(tǒng)開(kāi)發(fā)語(yǔ)言仍為C++,因?yàn)橥瑫r(shí)選用了MySQL 4.0、ICE、Linux系統(tǒng)和新文件系統(tǒng)等多項(xiàng)應(yīng)用經(jīng)驗(yàn)不足的新技術(shù),也為后來(lái)的系統(tǒng)表現(xiàn)動(dòng)蕩埋下了伏筆(新浪到2005年左右才逐步從FreeBSD和Solaris遷移到了CentOS系統(tǒng))

(圖5:4.0系統(tǒng)架構(gòu))

此時(shí)的4.0評(píng)論系統(tǒng)已從雙機(jī)互備擴(kuò)容到五機(jī)集群,進(jìn)入小范圍試用階段,雖然扛過(guò)了劉翔第一次奪金時(shí)創(chuàng)記錄的發(fā)帖高峰,但是倒在了2004年亞洲杯中國(guó)隊(duì)1:3敗于日本隊(duì)的那個(gè)夜晚。
(截圖5:劉翔首次奪金)

當(dāng)時(shí)系統(tǒng)在進(jìn)入宕機(jī)之前的最高發(fā)帖速度大約是每分鐘千帖量級(jí),在十年前還算得上是業(yè)界同類系統(tǒng)的峰值,最終確認(rèn)問(wèn)題出在文件系統(tǒng)的IO負(fù)載上。

設(shè)計(jì)索引緩存模塊時(shí)的設(shè)想過(guò)于理想化,雖然把單一數(shù)據(jù)表的讀寫(xiě)操作分解到了文件系統(tǒng)的多個(gè)文件上,但是不可避免的帶來(lái)了對(duì)機(jī)械磁盤(pán)的大量隨機(jī)定位讀寫(xiě)操作,在CentOS默認(rèn)的ext3文件系統(tǒng)上每個(gè)新聞對(duì)應(yīng)兩個(gè)文件的的設(shè)計(jì)(2004年新浪新聞總量千萬(wàn)左右),雖然已經(jīng)采取了128x256的兩層目錄HASH來(lái)預(yù)防單目錄下文件過(guò)多隱患,但剛上線時(shí)還表現(xiàn)良好的系統(tǒng),稍過(guò)幾個(gè)月后就把文件系統(tǒng)徹底拖垮了。

既然ext3無(wú)法應(yīng)對(duì)大數(shù)量文件的頻繁隨機(jī)讀寫(xiě),當(dāng)時(shí)我們還可以選擇使用B*樹(shù)數(shù)據(jù)結(jié)構(gòu)專為海量文件優(yōu)化的ReiserFS文件系統(tǒng),在與系統(tǒng)部同事配合反復(fù)對(duì)比測(cè)試,解決了ReiserFS與特定Linux Kernel版本搭配時(shí)的kswapd進(jìn)程大量消耗CPU資源的問(wèn)題之后,終于選定了可以正常工作的Kernel和ReiserFS對(duì)應(yīng)版本,當(dāng)然這也埋下了ReiserFS作者殺妻入獄后新裝的CentOS服務(wù)器找不到可用的ReiserFS安裝包這個(gè)大隱患。(Wiki:ReiserFS)

【評(píng)論系統(tǒng)4.0第二階段】
- 全系統(tǒng)異步化,索引分頁(yè)算法優(yōu)化

直到這個(gè)階段,新浪評(píng)論系統(tǒng)的前端頁(yè)面仍是傳統(tǒng)的Apache+CGI模式,隨著剩余頻道的逐步切換,新浪評(píng)論系統(tǒng)升級(jí)為靜態(tài)HTML頁(yè)面使用XMLHTTP組件異步加載XML數(shù)據(jù)的AJAX模式,當(dāng)時(shí)跨域限制更少的JSON還未流行。升級(jí)為當(dāng)時(shí)剛剛開(kāi)始流行的AJAX模式并不是盲目追新,而是為了實(shí)現(xiàn)一個(gè)非常重要的目標(biāo):緩存被動(dòng)更新的異步化。


(圖6:異步緩存更新流程)

隨著消息隊(duì)列的普遍應(yīng)用,4.0系統(tǒng)中所有的數(shù)據(jù)庫(kù)寫(xiě)操作和緩存主動(dòng)更新(即后臺(tái)程序邏輯觸發(fā)的更新)都已經(jīng)異步化了,當(dāng)時(shí)已經(jīng)在實(shí)踐中證明,系統(tǒng)訪問(wèn)量大幅波動(dòng)時(shí),模塊間異步化通信是解決系統(tǒng)伸縮性和保證系統(tǒng)響應(yīng)性的唯一途徑。但是在CGI頁(yè)面模式下由用戶動(dòng)作觸發(fā)的緩存被動(dòng)更新,只能阻塞在等待狀態(tài),直到查詢數(shù)據(jù)和更新緩存完成后才能返回,會(huì)導(dǎo)致前端服務(wù)器Apache CGI進(jìn)程的堆積。

使用AJAX模式異步加載數(shù)據(jù),可以在幾乎不影響用戶體驗(yàn)的前提下完成等待和循環(huán)重試動(dòng)作,接收緩存更新請(qǐng)求的支持優(yōu)先級(jí)的消息隊(duì)列還可以合并對(duì)同一頁(yè)面的重復(fù)請(qǐng)求,也隔離了用戶行為對(duì)前端服務(wù)器的直接沖擊,極大提高了前端服務(wù)器的伸縮性和適應(yīng)能力,甚至連低硬件配置的客戶端電腦在AJAX模式加載數(shù)據(jù)時(shí)都明顯更順暢了。前端頁(yè)面靜態(tài)化還可以把全部的數(shù)據(jù)組裝和渲染邏輯,包括分頁(yè)計(jì)算都轉(zhuǎn)移到了客戶端瀏覽器上,充分借用用戶端資源,唯一的缺點(diǎn)是對(duì)SEO不友好。

通過(guò)以上各項(xiàng)措施,此時(shí)的4.0系統(tǒng)抗沖擊能力已經(jīng)有明顯改善,但是接下來(lái)出現(xiàn)了新的問(wèn)題。在3.0系統(tǒng)時(shí)代,上萬(wàn)條評(píng)論的新聞已屬少見(jiàn),隨著業(yè)務(wù)的增長(zhǎng),類似2005年超女專題或者體育頻道NBA專題這樣千萬(wàn)評(píng)論數(shù)級(jí)別的巨無(wú)霸留言板開(kāi)始出現(xiàn)。

為了提高分頁(yè)操作時(shí)定位和讀取索引的效率,4.0系統(tǒng)的算法是先通過(guò)mmap操作把一個(gè)評(píng)論的索引文件加載到內(nèi)存,然后按照評(píng)論狀態(tài)(通過(guò)或者刪除)和評(píng)論時(shí)間進(jìn)行快速排序,篩選出通過(guò)狀態(tài)的帖子并且按照時(shí)間降序排列好,這樣讀取任意一頁(yè)的索引數(shù)據(jù),都是內(nèi)存里一次常量時(shí)間成本的偏移量定位和讀取操作。幾百條或者幾千條評(píng)論時(shí),上述方案運(yùn)作的很好,但是在千萬(wàn)留言數(shù)量的索引文件上進(jìn)行全量排序,占用大量?jī)?nèi)存和CPU資源,嚴(yán)重影響系統(tǒng)性能。曾經(jīng)嘗試改用BerkeleyDB的Btree模式來(lái)存儲(chǔ)評(píng)論索引,性能不升反降。

為了避免大數(shù)據(jù)量排序操作的成本,只能改為簡(jiǎn)單遍歷方式,從頭開(kāi)始依次讀取直到獲取到所需的數(shù)據(jù)。雖然可以通過(guò)從索引文件的兩端分別作為起點(diǎn),來(lái)提升較新和較早頁(yè)面的定位效率,但是遍歷讀取本身就是一個(gè)隨著請(qǐng)求頁(yè)數(shù)增大越來(lái)越慢的線性算法,并且隨著4.0系統(tǒng)滑動(dòng)翻頁(yè)功能的上線,原本用戶無(wú)法輕易訪問(wèn)到的中間頁(yè)面數(shù)據(jù)也開(kāi)始被頻繁請(qǐng)求,所以最終改為了兩端精確分頁(yè),中間模糊分頁(yè)的方式。模糊分頁(yè)就是根據(jù)評(píng)論帖子的通過(guò)比例,假設(shè)可顯示帖子均勻分布,一步跳到估算的索引偏移位置。畢竟在數(shù)十萬(wàn)甚至上百萬(wàn)頁(yè)的評(píng)論里,精確計(jì)算分頁(yè)偏移量沒(méi)有太大實(shí)際意義。


(截圖6:4.0滑動(dòng)翻頁(yè))

2005年非常受關(guān)注的日本申請(qǐng)加入聯(lián)合國(guó)常任理事國(guó)事件,引發(fā)了各家網(wǎng)站的民意沸騰,新浪推出了征集反日入常簽名活動(dòng)并在短短幾天內(nèi)征集到2000多萬(wàn)簽名。因?yàn)闆](méi)有預(yù)計(jì)到會(huì)有如此多的網(wǎng)民參與,最開(kāi)始簡(jiǎn)單實(shí)現(xiàn)的PHP+MySQL系統(tǒng)在很短時(shí)間內(nèi)就無(wú)法響應(yīng)了,然后基于4.0評(píng)論系統(tǒng)緊急加班開(kāi)發(fā)了一個(gè)簽名請(qǐng)?jiān)腹δ埽到y(tǒng)表現(xiàn)穩(wěn)定。
(截圖7:反日入常簽名)

【評(píng)論系統(tǒng)4.0第三階段】
- 簡(jiǎn)化緩存策略,進(jìn)一步降低文件系統(tǒng)IO

到了這個(gè)階段,硬件資源進(jìn)一步擴(kuò)容,評(píng)論系統(tǒng)的服務(wù)器數(shù)量終于達(dá)到了兩位數(shù),4.0系統(tǒng)已經(jīng)達(dá)到了當(dāng)初的“不宕機(jī)”設(shè)計(jì)目標(biāo),隨著網(wǎng)站的改版所有新聞頁(yè)面包括網(wǎng)站首頁(yè)都開(kāi)始實(shí)時(shí)加載和顯示最新的評(píng)論數(shù)量和最新的帖子列表,此時(shí)4.0系統(tǒng)承受的Hits量級(jí)已經(jīng)接近新浪新聞靜態(tài)池的水平。并且從這時(shí)起,新浪評(píng)論系統(tǒng)再?zèng)]有因?yàn)榱髁繅毫﹀礄C(jī)或者暫停服務(wù)過(guò)。


(圖7:4.5系統(tǒng)架構(gòu))

前面提到,新裝的CentOS系統(tǒng)很難找到足夠新版本的ReiserFS安裝包,甚至不得不降級(jí)系統(tǒng)版本,一直困擾性能表現(xiàn)的文件系統(tǒng)也接近了優(yōu)化的極限,這時(shí)候memcached出現(xiàn)了。

2006年左右memcached取代了4.0系統(tǒng)中索引緩存模塊的實(shí)體數(shù)據(jù)部分(主要是評(píng)論正文),索引緩存模塊在文件系統(tǒng)上只存儲(chǔ)索引數(shù)據(jù),評(píng)論文本都改用memcached存儲(chǔ),極大降低了文件系統(tǒng)的IO壓力。因?yàn)橄到y(tǒng)流量與熱點(diǎn)事件的時(shí)間相關(guān)性,僅僅保存最近幾周的評(píng)論就足以保證系統(tǒng)性能,極少量過(guò)期數(shù)據(jù)訪問(wèn)即使穿透到MySQL也問(wèn)題不大,當(dāng)然服務(wù)器宕機(jī)重啟和新裝服務(wù)器上線時(shí)要非常留意數(shù)據(jù)的加載預(yù)熱。


(圖8:4.5系統(tǒng)流程)

之后4.0系統(tǒng)進(jìn)入穩(wěn)定狀態(tài),小修小補(bǔ),又堅(jiān)持服役了若干年,并逐步拓展到股票社區(qū)、簽名活動(dòng)、三方辯論、專家答疑、觀點(diǎn)投票等產(chǎn)品線,直到2010年之后5.0系統(tǒng)的上線。

2008年5月12日當(dāng)天,我發(fā)現(xiàn)很多網(wǎng)友在地震新聞評(píng)論中詢問(wèn)親友信息,就立即開(kāi)發(fā)了基于評(píng)論系統(tǒng)的地震尋親功能并于當(dāng)晚上線。大約一周后為了配合Google發(fā)起的尋親數(shù)據(jù)匯總項(xiàng)目,還專門(mén)為Google爬蟲(chóng)提供了非異步加載模式的數(shù)據(jù)頁(yè)面以方便其抓取。


(截圖8:汶川地震尋親)

2004年上線的4.0系統(tǒng),2010~2011年后被5.0系統(tǒng)取代逐步下線,從上線到下線期間系統(tǒng)處理的用戶提交數(shù)據(jù)量變化趨勢(shì)如下圖。


(截圖9:4.0系統(tǒng)流量圖)

【高訪問(wèn)量UGC系統(tǒng)設(shè)計(jì)總結(jié)】

縱觀整個(gè)4.0系統(tǒng)的設(shè)計(jì)和優(yōu)化過(guò)程,在硬件資源有限的約束下,依靠過(guò)度設(shè)計(jì)的多層緩沖,完成了流量劇烈波動(dòng)時(shí)保障服務(wù)穩(wěn)定的最基本目標(biāo),但是也確實(shí)影響到了UGC系統(tǒng)最重要的數(shù)據(jù)更新實(shí)時(shí)性指標(biāo),數(shù)據(jù)更新的實(shí)時(shí)性也是之后5.0系統(tǒng)的重點(diǎn)改進(jìn)方向。

總結(jié)下來(lái),一般UGC系統(tǒng)的設(shè)計(jì)方針就是通過(guò)降低系統(tǒng)次要環(huán)節(jié)的實(shí)時(shí)一致性,在合理的成本范圍內(nèi),盡量提高系統(tǒng)響應(yīng)性能,而提高響應(yīng)性能的手段歸根結(jié)底就是三板斧:隊(duì)列(Queue)、緩存(Cache)和分區(qū)(Sharding):



關(guān)于數(shù)據(jù)庫(kù):


目前的互聯(lián)網(wǎng)系統(tǒng)大都嚴(yán)重依賴MySQL的Replication主從同步來(lái)實(shí)現(xiàn)系統(tǒng)橫向擴(kuò)展,雖然MySQL在新版本中陸續(xù)加入了RBR復(fù)制和半同步等機(jī)制,但是從庫(kù)的單線程寫(xiě)操作限制還是最大的的制約因素,至少到現(xiàn)在還沒(méi)有看到很理想的革新性的解決方案。

關(guān)于緩存,從瀏覽器到文件系統(tǒng)很多環(huán)節(jié)都涉及到緩存,這里主要說(shuō)的是應(yīng)用系統(tǒng)自己的部分:



一個(gè)UGC系統(tǒng)流量剛開(kāi)始上漲時(shí),初期的表面性能瓶頸一般會(huì)表現(xiàn)在Web Server層面,而實(shí)際上大多是數(shù)據(jù)庫(kù)的原因,但是經(jīng)充分優(yōu)化后,最終都會(huì)落在文件系統(tǒng)或者網(wǎng)絡(luò)通信的IO瓶頸上。直接承載用戶訪問(wèn)沖擊的前端服務(wù)器最好盡量設(shè)計(jì)為無(wú)狀態(tài)模式,降低宕機(jī)重啟后的修復(fù)工作量。

順帶提及,我在新浪聊天和評(píng)論系統(tǒng)的開(kāi)發(fā)過(guò)程中,逐步積累了一個(gè)Web應(yīng)用開(kāi)發(fā)組件庫(kù),在新浪全面轉(zhuǎn)向PHP之前,曾用于新浪的內(nèi)容管理(CMS)、用戶注冊(cè)和通行證、日志分析和論壇等使用C++的系統(tǒng),目前發(fā)布于

GitHub - pi1ot/webapplib: Web Application Library。

【評(píng)論系統(tǒng)5.0方案】

2010年后針對(duì)4.0系統(tǒng)的缺陷,啟動(dòng)了5.0系統(tǒng)工作。因?yàn)楣ぷ鞯慕唤樱?.0系統(tǒng)我只負(fù)責(zé)了方案設(shè)計(jì),具體開(kāi)發(fā)是交給其他同事負(fù)責(zé)的,線上的具體實(shí)現(xiàn)與原始設(shè)計(jì)方案可能會(huì)有區(qū)別。5.0系統(tǒng)極大簡(jiǎn)化了系統(tǒng)層次,在保證抵抗突發(fā)流量波動(dòng)性能的前提下,數(shù)據(jù)更新的及時(shí)性有了明顯的提高。

(圖9:5.0系統(tǒng)流程)

設(shè)計(jì)方案上的主要變化有:



【新聞評(píng)論產(chǎn)品總結(jié)】

新聞評(píng)論作為微博之前最能反映輿情民意的UGC平臺(tái),長(zhǎng)期承載了國(guó)內(nèi)互聯(lián)網(wǎng)用戶對(duì)時(shí)事新聞的匿名表達(dá)欲望,曾經(jīng)一度成為上到政府下到網(wǎng)民的關(guān)注焦點(diǎn)。雖然面臨了相對(duì)其他社區(qū)系統(tǒng)更為嚴(yán)厲的管控力度,也錯(cuò)過(guò)了實(shí)施實(shí)名制改造時(shí)邁向社區(qū)化的最佳時(shí)機(jī),但是無(wú)論如何,在21世界的前十年,國(guó)內(nèi)門(mén)戶網(wǎng)站的新聞評(píng)論服務(wù),都是中國(guó)互聯(lián)網(wǎng)產(chǎn)品和技術(shù)發(fā)展歷史上絕對(duì)不能錯(cuò)過(guò)的一筆。

【作者個(gè)人信息】

劉立,2000年畢業(yè)于哈爾濱工業(yè)大學(xué)計(jì)算機(jī)系,2000至2013年工作于新浪網(wǎng)研發(fā)中心和門(mén)戶技術(shù)部門(mén),任高級(jí)技術(shù)經(jīng)理,具備十年以上的門(mén)戶級(jí)別資訊和社區(qū)系統(tǒng)架構(gòu)及項(xiàng)目管理經(jīng)驗(yàn)。

微博賬號(hào):

@pi1ot

【附】歷史新聞事件和評(píng)論地址

2000年

新浪最早新聞評(píng)論

╫ДялхЭ╫ЯфП╠╗цШ лЛ╫РспялцЯ200мР新浪跟帖_新浪網(wǎng)

2001年

南海撞機(jī)

中國(guó)拒絕美就撞機(jī)賠償3.4萬(wàn)美元的決定新浪跟帖_新浪網(wǎng)
911事件

中新社:兩架飛機(jī)撞上紐約世貿(mào)中心頂樓發(fā)生爆炸新浪跟帖_新浪網(wǎng)

2003年

非典事件

抗擊非典專題_新聞中心新浪跟帖_新浪網(wǎng)
孫志剛事件

?????????????????????????????????新浪跟帖_新浪網(wǎng)

2004年

劉翔奪金創(chuàng)互聯(lián)網(wǎng)留言世界紀(jì)錄

劉翔奪金掀網(wǎng)民狂潮 新浪創(chuàng)互聯(lián)網(wǎng)留言世界紀(jì)錄_2004雅典奧運(yùn)會(huì)亞洲杯中日球賽

亞洲杯-李明精彩球難救主 國(guó)足1-3日本無(wú)緣冠軍新浪跟帖_新浪網(wǎng)

2005年

2005超女(評(píng)論數(shù):1200萬(wàn))

╨Чдонюйс2005Ё╛╪╤е╝иЫ新浪跟帖_新浪網(wǎng)
體育頻道NBA專題(評(píng)論數(shù):2億1千萬(wàn))

新浪跟帖_新浪網(wǎng)反日入常簽名(簽名數(shù):2012萬(wàn))

è??ò
2008年

汶川地震(評(píng)論數(shù):338萬(wàn))

四川汶川強(qiáng)烈地震新浪跟帖_新浪網(wǎng)
地震尋親

??′¨μ??e?°?×_100865?°?×??ì¨_D?à?í?劉翔退賽

劉翔因傷退出奧運(yùn)會(huì)110米欄比賽新浪跟帖_新浪網(wǎng)
74
73
25
news

版權(quán)所有? 億企邦 1997-2022 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉