Digg工程師講述Digg背後的技術

發表於2011-08-26

注:本文轉載自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.

 

相關文章