探索Digg系統(tǒng)架構(gòu)的秘密
在過(guò)去的幾年間,我們一直致力于重構(gòu)Digg的架構(gòu),現(xiàn)在我們稱之為“Digg V4”.本文我們將全面介紹Digg的使用的系統(tǒng)和技術(shù)。找出Digg引擎的秘密。 首先,我們來(lái)看下Digg給大眾用戶提供的服務(wù)吧:
- 一個(gè)社會(huì)化的新聞?wù)军c(diǎn)
- 為個(gè)人可定制的社會(huì)新聞
- 廣告平臺(tái)
- API 服務(wù)
- 博客和文檔站點(diǎn)
人們通過(guò)瀏覽器或者其他應(yīng)用來(lái)訪問(wèn)這些Digg服務(wù)。一些有Digg賬戶的用戶,可以得到“我的新聞”。每位用戶可以得到的我們稱之為“熱門新聞”。我們有digg.com和移動(dòng)版的m.digg.com,API服務(wù)的services.digg.com,信息介紹的about.digg.com,為開發(fā)者服務(wù)的developers.digg.com。這些站點(diǎn)統(tǒng)一為用戶,新聞發(fā)布者,開發(fā)人員提供了博客和文檔服務(wù)。
本文主要介紹Digg在社會(huì)化新聞產(chǎn)品中使用的高級(jí)技術(shù)。
我們努力要做的
我們努力搭建以用戶發(fā)布新聞和廣告商發(fā)布廣告為基礎(chǔ) 一個(gè)社會(huì)新聞?wù)军c(diǎn)。
故事提交 注冊(cè)用戶提交文章,文章包含:一個(gè)標(biāo)題,一篇段落,一個(gè)媒體類型,一個(gè)主題,或者一個(gè)縮略圖。這些內(nèi)容通過(guò)一系列的元字符標(biāo)準(zhǔn)(Facebook open graph protocol, OEmbed等)如從文章中解壓出來(lái),當(dāng)然提交者在提交前最后這些元字符具體是什么。廣告發(fā)布商將廣告發(fā)布到另外一個(gè)獨(dú)立的系統(tǒng),當(dāng)然如果Dugg夠的話,完全可以成為故事。
故事列表 在個(gè)性化新聞產(chǎn)品“我的新聞“里,你追隨的用戶發(fā)布的所有故事以“故事列表”顯示,采用最近發(fā)布,媒體類型,故事的主題等方式排列。
故事動(dòng)作 用戶可以對(duì)故事進(jìn)行操作,比如說(shuō)閱讀,點(diǎn)擊,Digg,掩埋,發(fā)表評(píng)論,投票等等。沒有注冊(cè)登錄的用戶只能閱讀和點(diǎn)擊這些故事。
故事推薦 我們會(huì)決定每個(gè)小時(shí)有一些故事會(huì)從最近故事列表轉(zhuǎn)移到熱門新聞列表。我們的算法(這個(gè)是保密的)通過(guò)查看用戶的行為和故事內(nèi)容的分類來(lái)決定選擇哪些故事進(jìn)入熱門新聞。
我們是如何實(shí)現(xiàn)它的?
讓我們從宏觀的角度看下如果一個(gè)用戶訪問(wèn)Digg的站點(diǎn),做一些基于內(nèi)容的操作。下面的圖片顯示了公眾看到的內(nèi)容及內(nèi)部提供的頁(yè)面、圖片、API請(qǐng)求等服務(wù)。
我們內(nèi)部系統(tǒng)的簡(jiǎn)單描述如上。我們的API服務(wù)代理想內(nèi)部后端服務(wù)進(jìn)行請(qǐng)求。前端的服務(wù)是被虛擬化的(與緩存是有區(qū)別的),并且放置在相同的服務(wù)層。CMS和廣告系統(tǒng)將在此文章中不做詳細(xì)說(shuō)明,縱覽整個(gè)系統(tǒng),大致可以分為以下兩類:同步和異步。
1、對(duì)用戶進(jìn)行即時(shí)響應(yīng)的同步操作
同步操作主要表示對(duì)用戶請(qǐng)求(包括API請(qǐng)求)的即時(shí)快速響應(yīng),包括一些在頁(yè)面中通過(guò)AJAX方式進(jìn)行的異步請(qǐng)求。這些操作通常要求最長(zhǎng)一兩秒的時(shí)間內(nèi)就能完成。
2、離線批量進(jìn)行的異步計(jì)算
除了實(shí)時(shí)響應(yīng)的請(qǐng)求外,有時(shí)候還需要進(jìn)行一些批量的計(jì)算任務(wù),這些任務(wù)可能是間接的被用戶啟動(dòng)的,但用戶不會(huì)等待這些任務(wù)的完成。這些異步計(jì)算通??赡軙?huì)花費(fèi)數(shù)秒,數(shù)分鐘甚至幾小時(shí)。
上面所說(shuō)的兩部分如下圖所示:
下面就更加深入的了解各個(gè)組成部分。
線上系統(tǒng)
提供頁(yè)面和API請(qǐng)求服務(wù)的程序主要以PHP(前端Web頁(yè)面,Drupal CMS)和使用的Python(API服務(wù),Tornado)編寫。前端通過(guò)Thrift protocol協(xié)議來(lái)調(diào)用后端的服務(wù)(Python)。很多數(shù)據(jù)會(huì)被如Memcached 和Redis 這樣的內(nèi)存緩存系統(tǒng)緩存。
消息和事件
線上和離線的信息通過(guò)主要數(shù)據(jù)存儲(chǔ)transient / logging系統(tǒng)這種同步方式連接和使用 RabbitMQ 作隊(duì)列系統(tǒng),將不用同步響應(yīng)的操作放到隊(duì)列異步地進(jìn)行。比如說(shuō)”一個(gè)用戶Dugg了一個(gè)故事“,”計(jì)算這個(gè)東西“。
批處理和異步系統(tǒng)
上面的消息系統(tǒng)是指隊(duì)列,而這個(gè)指的是具體從隊(duì)列取出任務(wù)執(zhí)行的部分。此系統(tǒng)將任務(wù)從隊(duì)列中取出,進(jìn)行一定的計(jì)算后再對(duì)主存儲(chǔ)進(jìn)行操作,對(duì)主存儲(chǔ)的操作在實(shí)時(shí)系統(tǒng)和異步批量系統(tǒng)中都是一樣的。
當(dāng)隊(duì)列中發(fā)現(xiàn)信息時(shí),一個(gè)“工作者”被調(diào)用來(lái)完成特定的動(dòng)作。一些信息由事件觸發(fā),有點(diǎn)象cron機(jī)制。然后工作者對(duì)主存儲(chǔ)設(shè)備或者離線存儲(chǔ)設(shè)備的數(shù)據(jù)進(jìn)行運(yùn)算和操作,在HDFS中記錄日志,然后把結(jié)果寫回到主存儲(chǔ)設(shè)備,這樣在線服務(wù)就可以使用他們。舉個(gè)例子:比如說(shuō)索引新的故事,計(jì)算故事提升算法,運(yùn)行分析工作。
數(shù)據(jù)存儲(chǔ)
Digg根據(jù)數(shù)據(jù)的類型和使用方式的不同,將數(shù)據(jù)存儲(chǔ)在不同的系統(tǒng)中,當(dāng)然,有時(shí)候還避免不了有一些歷史原因。
- Cassandra:對(duì)諸如文章、用戶、Digg操作記錄等“類對(duì)象(Object-like)”的信息,都是使用Cassandra來(lái)存儲(chǔ)的。我們使用的是Cassandra0.6版本,由于0.6版本并沒有劫持二級(jí)索引,于是我們將數(shù)據(jù)通過(guò)應(yīng)用層處理后再用它進(jìn)行存儲(chǔ)。比如我們的用戶數(shù)據(jù)層提供通過(guò)用戶名及Email地址來(lái)查詢用戶信息的接口。這樣就允許了服務(wù)器能夠查看,比如說(shuō),通過(guò)用戶的用戶名或者郵件而不是用戶的用戶ID來(lái)查詢。這里我們使用了Python Lazyboy wrapper。
- HDFS:來(lái)自站點(diǎn)和API事件,用戶活動(dòng)的日志都在這里。主要用到日志信息存儲(chǔ)及分析計(jì)算,利用 Hive 操作 Hadoop,進(jìn)行MapReduce計(jì)算。
- MogileFS:是一個(gè)分布式文件存儲(chǔ)系統(tǒng),用以存儲(chǔ)二進(jìn)制的文件,比如用戶頭像,截屏圖片等。當(dāng)然,文件存儲(chǔ)的上層還有統(tǒng)一的CDN。
- MySQL:目前我們的文章置頂功能上使用了MySQL存儲(chǔ)一些數(shù)據(jù),用來(lái)存儲(chǔ)故事提升算法和計(jì)算的數(shù)據(jù),因?yàn)檫@一功能需要大量的JOIN操作。很自然不適合其他類型的數(shù)據(jù)存儲(chǔ)。與此同時(shí) HBase 好像也是個(gè)不錯(cuò)的考慮。
- Redis:由于 Redis 的高性能及其靈活的數(shù)據(jù)結(jié)構(gòu),我們用它來(lái)提供對(duì) Digg Streaming API 的存儲(chǔ),存儲(chǔ)每個(gè)用戶新聞數(shù)據(jù),每個(gè)用戶的新聞具有不同和需要及時(shí)更新的特征。同時(shí)用Redis來(lái)提供Digg Streaming API和real time view and click counts服務(wù)。作為一款基于內(nèi)存存儲(chǔ)的系統(tǒng),它提供了超低的負(fù)載。
- SOLR:用來(lái)構(gòu)建全文索引系統(tǒng)。以提供對(duì)文章內(nèi)容、話題等的全文檢索。
- Scribe:日志收集系統(tǒng),比syslog-ng更強(qiáng)大更簡(jiǎn)單。用它收集的日志會(huì)被放到HDFS進(jìn)行分析計(jì)算。
操作系統(tǒng)和配置
digg目前運(yùn)行在基于GNU/Linux的Debian系統(tǒng)。配置了Clusto,Puppet。使用的是Zookeeper做系統(tǒng)協(xié)調(diào)。
原文鏈接:http://about.digg.com/blog/how-digg-is-built