注:本文轉載自NoSQLFan
雖然最近業績有所下滑,也出現了一些技術故障,但Digg作為首屈一指的社會化新聞網站,其背後的技術還是值得一探,Digg工程師 Dave Beckett 在今年4月份寫一篇名為《How Digg is Built》的文章,非常系統地將Digg背後的技術展現給大家,非常值得一看。
一、Digg提供的服務
- 一個社會化的新聞網站
- 對個人來說它又是一個私人社會化新聞釋出平臺
- 一個廣告平臺
- 一個開放API的平臺
- 部落格及文件系統
二、Digg 的核心功能
- 文章提交功能 – 提交你認為有價值的新聞
- 文章列表功能 – 將使用者提交的新聞做各種不同緯度的列表(個人新聞,最近釋出等)
- 對文章的操作 – 使用者可以對文章進行各種操作,包括閱讀、點選、digg、評論、為評論評分等等
- 置頂文章功能 – Digg會定時將一些熱門的文章置頂到Digg首頁,從頁讓更多人能夠看到
三、Digg功能的背後的實現
首先我們看一個流程圖,描述了普通使用者在使用Digg其間Digg的具體模組運作:
點選可檢視大圖
其實這中間的操作包括了兩部分:同步和非同步
- 對使用者進行即時響應的同步操作:同步操作主要表示對使用者請求(包括API請求)的即時快速響應,包括一些在頁面中通過AJAX方式進行的非同步請求。這些操作通常要求最長一兩秒的時間內就能完成。
- 離線批量進行的非同步計算:除了實時響應的請求外,有時候還需要進行一些批量的計算任務,這些任務可能是間接的被使用者啟動的,但使用者不會等待這些任務的完成。這些非同步計算通常可能會花費數秒,數分鐘甚至幾小時。
這兩部分在Digg中的應用方式可以用下面這張圖描述:
點選可檢視大圖
上面是總體概述,下面一部分我們會深入Digg的各個功能部件進行深入研究。
1.線上web系統
提供Web頁面服務及API服務的部分組成如下:PHP作前端語言構建的CMS系統,Python構建的API伺服器,它們執行在 Tornado 上。它們通過 Thrift 協議與主儲存層進行互動,很多資料會被如Memcached 和Redis 這樣的記憶體快取系統快取。
2.訊息系統
Digg 使用RabbitMQ 作佇列系統,將不用同步響應的操作放到佇列非同步地進行。
3.批量非同步處理系統
上面的訊息系統是指佇列,而這個指的是具體從佇列取出任務執行的部分。此係統將任務從佇列中取出,進行一定的計算後再對主儲存進行操作,對主儲存的操作在實時系統和非同步批量系統中都是一樣的。
4.資料儲存層
資料儲存層Digg使用了多個產品來完成各種不同的任務,具體列表如下:
- Cassandra:對諸如文章、使用者、Digg操作記錄等 “Object-like” 的資訊,都是使用Cassandra來儲存的。我們使用的是Cassandra0.6版本,由於0.6版本並沒有劫持二級索引,於是我們將資料通過應用層處理後再用它進行儲存。比如我們的使用者資料層提供通過使用者名稱及Email地址來查詢使用者資訊的介面。
- HDFS:主要用到日誌資訊儲存及分析計算,利用Hive 操作 Hadoop,進行MapReduce計算。
- MogileFS:是一個分散式檔案儲存系統,用以儲存二進位制的檔案,比如使用者頭像,截圖圖片等。當然,檔案儲存的上層還有統一的CDN。
- MySQL:目前我們的文章置頂功能上使用了MySQL儲存一些資料,因為這一功能需要大量的JOIN操作。與此同時 HBase 好像也是個不錯的考慮。
- Redis:由於Redis 的高效能及其靈活的資料結構,我們用它來提供對 Digg Streaming API 的儲存,同時我們還用Redis 來構建實時瀏覽和點選計數器。
- SOLR:用來構建全文索引系統。以提供對文章內容、話題等的全文檢索。
- Scribe:日誌收集系統,比syslog-ng更強大更簡單。用它收集的日誌會被放到HDFS進行分析計算。
5.作業系統及配置
Digg runs on Debian stable based GNU/Linux servers which we configure with Clusto, Puppet and using a configuration system over Zookeeper.