作為140個(gè)字的締造者,twitter太簡(jiǎn)單了,又太復(fù)雜了,簡(jiǎn)單是因?yàn)閮H僅用140個(gè)字居然使有幾次世界性事件的傳播速度超過(guò)任何媒體,復(fù)雜是因?yàn)橐獮?億用戶提供這看似簡(jiǎn)單的140個(gè)字的服務(wù),這真的是因?yàn)楹?jiǎn)單,所以復(fù)雜??墒潜容^遺憾的是目前在中國(guó)大陸twitter是無(wú)法訪問(wèn)的,但作為一個(gè)愛(ài)好架構(gòu)的程序猿,這道墻是必須得翻的,墻外的世界更精彩。今天就結(jié)合網(wǎng)絡(luò)上的一些資料,來(lái)淺談一下我對(duì)twitter網(wǎng)站架構(gòu)的學(xué)習(xí)體會(huì),希望給路過(guò)的朋友一點(diǎn)啟示.......
一、twitter網(wǎng)站基本情況概覽
- 截至2011年4月,twitter的注冊(cè)用戶約為1.75億,并以每天300000的新用戶注冊(cè)數(shù)增長(zhǎng),但是其真正的活躍用戶遠(yuǎn)遠(yuǎn)小于這個(gè)數(shù)目,大部分注冊(cè)用戶都是沒(méi)有關(guān)注者或沒(méi)有關(guān)注別人的,這也是與facebook的6億活躍用戶不能相提并論的。
- twitter每月有180萬(wàn)獨(dú)立訪問(wèn)用戶數(shù),并且75%的流量來(lái)自twitter.com以外的網(wǎng)站。每天通過(guò)API有30億次請(qǐng)求,每天平均產(chǎn)生5500次tweet,37%活躍用戶為手機(jī)用戶,約60%的tweet來(lái)自第三方的應(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ī)和第三方為主要來(lái)源。
- Ruby on Rails:web應(yīng)用程序的框架
- Erlang:通用的面向并發(fā)的編程語(yǔ)言,開(kāi)源項(xiàng)目地址:http://www./
- AWStats:實(shí)時(shí)日志分析系統(tǒng):開(kāi)源項(xiàng)目地址:http://awstats./
- Memcached:分布式內(nèi)存緩存組建
- Starling:Ruby開(kāi)發(fā)的輕量級(jí)消息隊(duì)列
- Varnish:高性能開(kāi)源HTTP加速器
- Kestrel:scala編寫的消息中間件,開(kāi)源項(xiàng)目地址:http://github.com/robey/kestrel
- Comet Server:Comet是一種ajax長(zhǎng)連接技術(shù),利用Comet可以實(shí)現(xiàn)服務(wù)器主動(dòng)向web瀏覽器推送數(shù)據(jù),從而避免客戶端的輪詢帶來(lái)的性能損失。
- libmemcached:一個(gè)memcached客戶端
- 使用mysql數(shù)據(jù)庫(kù)服務(wù)器
- Mongrel:Ruby的http服務(wù)器,專門應(yīng)用于rails,開(kāi)源項(xiàng)目地址:http:///projects/mongrel/
- Munin:服務(wù)端監(jiān)控程序,項(xiàng)目地址:http:///
- Nagios:網(wǎng)絡(luò)監(jiān)控系統(tǒng),項(xiàng)目地址:http://www./
三、緩存
講著講著就又說(shuō)到緩存了,確實(shí),緩存在大型web項(xiàng)目中起到了舉足輕重的作用,畢竟數(shù)據(jù)越靠近CPU存取速度越快。下圖是twitter的緩存架構(gòu)圖:
大量使用memcached作緩存
- 例如,如果獲得一個(gè)count非常慢,你可以將count在1毫秒內(nèi)扔入memcached
- 獲取朋友的狀態(tài)是很復(fù)雜的,這有安全等其他問(wèn)題,所以朋友的狀態(tài)更新后扔在緩存里而不是做一個(gè)查詢。不會(huì)接觸到數(shù)據(jù)庫(kù)
- ActiveRecord對(duì)象很大所以沒(méi)有被緩存。Twitter將critical的屬性存儲(chǔ)在一個(gè)哈希里并且當(dāng)訪問(wèn)時(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,它包含了通過(guò)API客戶端訪問(wèn)到的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ù)允許你通過(guò)TCP/IP從遠(yuǎn)程Ruby對(duì)象發(fā)送和接收消息,但是它有點(diǎn)脆弱
- 移到Rinda,它是使用tuplespace模型的一個(gè)分享隊(duì)列,但是隊(duì)列是持久的,當(dāng)失敗時(shí)消息會(huì)丟失
- 嘗試了Erlang
- 移到Starling,用Ruby寫的一個(gè)分布式隊(duì)列
- 分布式隊(duì)列通過(guò)將它們寫入硬盤用來(lái)挽救系統(tǒng)崩潰。其他大型網(wǎng)站也使用這種簡(jiǎn)單的方式
五、總結(jié)
1、數(shù)據(jù)庫(kù)一定要進(jìn)行合理索引
2、要盡可能快的認(rèn)知你的系統(tǒng),這就要你能靈活地運(yùn)用各種工具了
3、緩存,緩存,還是緩存,緩存一切可以緩存的,讓你的應(yīng)用飛起來(lái)。
|