揭秘Twitter網(wǎng)站架構(gòu):沒有最復(fù)雜只有更復(fù)雜
作為140個(gè)字的締造者,twitter太簡(jiǎn)單了,又太復(fù)雜了,簡(jiǎn)單是因?yàn)閮H僅用140個(gè)字居然使有幾次世界性事件的傳播速度超過任何媒體,復(fù)雜是因?yàn)橐獮?億用戶提供這看似簡(jiǎn)單的140個(gè)字的服務(wù),這真的是因?yàn)楹?jiǎn)單,所以復(fù)雜??墒潜容^遺憾的是目前在中國(guó)大陸twitter是無法訪問的,但作為一個(gè)愛好架構(gòu)的程序猿,這道墻是必須得翻的,墻外的世界更精彩。今天就結(jié)合網(wǎng)絡(luò)上的一些資料,來淺談一下我對(duì)twitter網(wǎng)站架構(gòu)的學(xué)習(xí)體會(huì),希望給路過的朋友一點(diǎn)啟示.......
一、twitter網(wǎng)站基本情況概覽
◆ 截至2011年4月,twitter的注冊(cè)用戶約為1.75億,并以每天300000的新用戶注冊(cè)數(shù)增長(zhǎng),但是其真正的活躍用戶遠(yuǎn)遠(yuǎn)小于這個(gè)數(shù)目,大部分注冊(cè)用戶都是沒有關(guān)注者或沒有關(guān)注別人的,這也是與facebook的6億活躍用戶不能相提并論的。
◆ twitter每月有180萬獨(dú)立訪問用戶數(shù),并且75%的流量來自twitter.com以外的網(wǎng)站。每天通過API有30億次請(qǐng)求,每天平均產(chǎn)生5500次tweet,37%活躍用戶為手機(jī)用戶,約60%的tweet來自第三方的應(yīng)用。
◆ 平臺(tái):Ruby on Rails 、Erlang 、MySQL 、Mongrel 、Munin 、Nagios 、Google Analytics 、AWStats 、Memcached
下圖是twitter的整體架構(gòu)設(shè)計(jì)圖:

二、twitter的平臺(tái)
twitter平臺(tái)大致由twitter.com、手機(jī)以及第三方應(yīng)用構(gòu)成,如下圖所示:

其中流量主要以手機(jī)和第三方為主要來源。
◆ Ruby on Rails:web應(yīng)用程序的框架
◆ Erlang:通用的面向并發(fā)的編程語(yǔ)言,開源項(xiàng)目地址:http://www.erlang.org/
◆ AWStats:實(shí)時(shí)日志分析系統(tǒng):開源項(xiàng)目地址:http://awstats.sourceforge.net/
◆ Memcached:分布式內(nèi)存緩存組建
◆ Starling:Ruby開發(fā)的輕量級(jí)消息隊(duì)列
◆ Varnish:高性能開源HTTP加速器
◆ Kestrel:scala編寫的消息中間件,開源項(xiàng)目地址:http://github.com/robey/kestrel
◆ Comet Server:Comet是一種ajax長(zhǎng)連接技術(shù),利用Comet可以實(shí)現(xiàn)服務(wù)器主動(dòng)向web瀏覽器推送數(shù)據(jù),從而避免客戶端的輪詢帶來的性能損失。
◆ libmemcached:一個(gè)memcached客戶端
◆ 使用mysql數(shù)據(jù)庫(kù)服務(wù)器
◆ Mongrel:Ruby的http服務(wù)器,專門應(yīng)用于rails,開源項(xiàng)目地址:http://rubyforge.org/projects/mongrel/
◆ Munin:服務(wù)端監(jiān)控程序,項(xiàng)目地址:http://munin-monitoring.org/
◆ Nagios:網(wǎng)絡(luò)監(jiān)控系統(tǒng),項(xiàng)目地址:http://www.nagios.org/
三、緩存
講著講著就又說到緩存了,確實(shí),緩存在大型web項(xiàng)目中起到了舉足輕重的作用,畢竟數(shù)據(jù)越靠近CPU存取速度越快。下圖是twitter的緩存架構(gòu)圖:

大量使用memcached作緩存
◆ 例如,如果獲得一個(gè)count非常慢,你可以將count在1毫秒內(nèi)扔入memcached
◆ 獲取朋友的狀態(tài)是很復(fù)雜的,這有安全等其他問題,所以朋友的狀態(tài)更新后扔在緩存里而不是做一個(gè)查詢。不會(huì)接觸到數(shù)據(jù)庫(kù)
◆ ActiveRecord對(duì)象很大所以沒有被緩存。Twitter將critical的屬性存儲(chǔ)在一個(gè)哈希里并且當(dāng)訪問時(shí)遲加載
◆ 90%的請(qǐng)求為API請(qǐng)求。所以在前端不做任何page和fragment緩存。頁(yè)面非常時(shí)間敏感所以效率不高,但Twitter緩存了API請(qǐng)求
在memcached緩存策略中,又有所改進(jìn),如下所述:
1、創(chuàng)建一個(gè)直寫式向量緩存Vector Cache,包含了一個(gè)tweet ID的數(shù)組,tweet ID是序列化的64位整數(shù),命中率是99%
2、加入一個(gè)直寫式行緩存Row Cache,它包含了數(shù)據(jù)庫(kù)記錄:用戶和tweets。這一緩存有著95%的命中率。
3、引入了一個(gè)直讀式的碎片緩存Fragmeng Cache,它包含了通過API客戶端訪問到的sweets序列化版本,這些sweets可以被打包成json、xml或者Atom格式,同樣也有著95%的命中率。
4、為頁(yè)面緩存創(chuàng)建一個(gè)單獨(dú)的緩存池Page Cache。該頁(yè)面緩存池使用了一個(gè)分代的鍵模式,而不是直接的實(shí)效。
四、消息隊(duì)列
◆ 大量使用消息。生產(chǎn)者生產(chǎn)消息并放入隊(duì)列,然后分發(fā)給消費(fèi)者。Twitter主要的功能是作為不同形式(SMS,Web,IM等等)之間的消息橋
◆ 使用DRb,這意味著分布式Ruby。有一個(gè)庫(kù)允許你通過TCP/IP從遠(yuǎn)程Ruby對(duì)象發(fā)送和接收消息,但是它有點(diǎn)脆弱
◆ 移到Rinda,它是使用tuplespace模型的一個(gè)分享隊(duì)列,但是隊(duì)列是持久的,當(dāng)失敗時(shí)消息會(huì)丟失
◆ 嘗試了Erlang
◆ 移到Starling,用Ruby寫的一個(gè)分布式隊(duì)列
◆ 分布式隊(duì)列通過將它們寫入硬盤用來挽救系統(tǒng)崩潰。其他大型網(wǎng)站也使用這種簡(jiǎn)單的方式
五、總結(jié)
1、數(shù)據(jù)庫(kù)一定要進(jìn)行合理索引
2、要盡可能快的認(rèn)知你的系統(tǒng),這就要你能靈活地運(yùn)用各種工具了
3、緩存,緩存,還是緩存,緩存一切可以緩存的,讓你的應(yīng)用飛起來。
原文:http://www.cnblogs.com/lonelysharer/archive/2011/10/10/2205116.html
【編輯推薦】