摘要:Twitter出道之初只是個奮鬥在RoR上的小站點,而現在已擁有1.5億的活躍用戶,系統日傳輸tweet更多達4億條,並已完成了以服務爲核心的系統架構蛻變。後端
Twitter現在在世界範圍內已擁有1.5億的活躍用戶,爲了給用戶生成timeline(時間軸)需支撐30萬QPS,其firehose每秒一樣生成22MB數據。整個系統天天傳輸tweet 4億條,而且只須要5分鐘就可讓一條tweet從Lady Gaga手中呈現到她3100萬粉絲的屏幕上。當下Twitter系統的規模及強大的吞吐量確實惹人豔羨,然而在出道之初Twitter也只是個奮鬥在 RoR上的小站點而已,下面就一覽Twitter如何完成從RoR到以服務爲核心的系統架構蛻變。瀏覽器
Twitter系統的一些特性:緩存
1. 當下的Twitter已不知足於Web Ap的現狀。Twitter指望成爲一組API,驅動世界範圍內的移動客戶端,成爲世界級最大的實時事件鏈之一。服務器
2. Twitter主導的是消費機制,而不是生產機制。每秒讀取timeline的操做就會產生30萬次的查詢,而每秒的寫入請求只有6000左右。網絡
3. 離羣值,擁有巨量粉絲的個體開始變得廣泛,大量粉絲擁有者發送tweet時會由於大量的擴散而變得緩慢。Twitter試圖將這個延時控制在5秒內,可是也並不是一直生效,特別是名人們發送tweet以及相互轉發變得愈來愈頻繁後。這樣就致使轉發的內容可能比原始內容先一步到達共同粉絲的界面上,這樣一來,就高價值用戶來講,Twitter的主要精力必須從寫操做轉移到讀操做上。架構
4. 使用Redis集羣處理Home Timeline(首頁時間軸,包含了衆多關注者的tweet),最大條數爲800。app
5. 從你關注的人和你點擊的連接,Twitter能夠獲知一系列關於你的信息。負載均衡
6. 用戶最關心的是tweet內容,然而大部分的基礎設施卻和這些內容不相關。異步
7. 對如此複雜堆棧進行性能追蹤所需求的監視和調試系統每每很是複雜,一樣舊決策的影響會不時的出現。
1. 1.5億的用戶以及支撐timeline(home及Search)的30萬QPS會讓最初的具體實現(Naive materialization)變得緩慢。
2. 最初的具體實現由大量選擇語句組成,遍佈整個Twitter系統,曾今使用後被取締。
3. 使用一個基於寫的擴散方案。在接收到tweet時,系統將作大量的計算以發現tweet須要呈現的用戶。這將造就更快、方便的讀取,不要對讀作任何的計算。因爲全部的計算都被安排到寫去執行,每秒大約可處理4000個寫操做,比讀操做要慢一些。
1. Platform Service團隊承擔起了Twitter核心基礎設施的一切事務:
2. Twitter還擁有一個架構團隊。負責Twitter的總體架構,維護技術負債列表。
1. 任什麼時候刻都有用戶在Twitter上發佈內容,Twitter的任務就是考慮如何將消息同步發出並呈現到粉絲。
2. 真正的挑戰就是實時性約束,目標則是在5秒內將消息發送到粉絲:
3. 兩種類型的timeline:user timeline(用戶時間軸,即指定用戶tweet頁)及home timeline
1. 指向timeline,好比Twitter.com及hone_line API。之因此將tweet發送給你,是由於你對其進行了請求。基於Pull的交付:你經過REST API的調用向Twitter請求這些數據。
2. 查詢timeline,搜索API。對資料庫進行查詢,儘量快的返回全部匹配指定查詢的tweet。
Push模式
1. Twitter運行了一個巨型的實時事件系統,經過Firehose以每秒22M的速度推送tweet。
2. 用戶流鏈接。TweetDeck及Mac版的Twitter一樣經過這種方式驅動。在登陸的時候,Twitter會查看你的社交圖,一樣也只會推送關注人的消息,重建home timeline,而不是在持久的鏈接過程當中得到同一個timeline。
3. 查詢API,發佈一個對tweet的持續查詢時,每當有新的tweet發佈,而且被認定匹配這個查詢,系統會將這條tweet發送給相應的socket。
高等級基於Pull的timeline
高等級的搜索
1. 全部的計算都經過讀來解決,這讓寫更加簡潔
2. 當有tweet生成時,Ingester會作相應的語法分析和索引,隨後會將其傳入Early Bird機器中。Early Bird屬於Lucene的修改版本,同時索引都儲存在內存中。
3. 在tweet擴散過程當中,它可能會被儲存在多個home timeline中,其個數由粉絲的數量決定。然而在Early Bird中,一個tweet只會被存入一個Early Bird機器中(不包括備份)。
4. Blender負責timeline的查詢,橫跨整個數據中心作集散操做。它對每一個Early Bird作查詢,以發現與查詢條件匹配的內容。若是你搜索「New York Times」,Blender會查詢數據中心的全部分片並返回結果,同時還會作分類、合併及從新排序等。排序的規則基於互動的數據,也就是轉發、收藏及評論的數量等。
5. 互動的信息使用寫的模式完成,這裏會創建一個互動timeline。若是你收藏或者回復一個tweet,將會觸發對互動timeline的修改;相似於home timeline,它一樣由一系列的互動ID組成,好比收藏ID、評論ID等等。
6. 全部這些信息都被送到Blender。以讀的方式進行重算、合併以及分類,返回的結果就是search timeline爲你呈現的界面。
7. Discovery是個基於你相關信息的定製搜索,這些信息主要來自你關注的人、打開的連接,而從新排序的規則一樣基於這些信息。
Search和Pull是相反的
1. 搜索和pull看起來很是類似,其實他們有着本質上的區別。
2. 在home timeline狀況下:
3. 搜索timeline狀況:
4. Tweet的內容基本上與大多數的基礎設施都是無關的。T-bird存儲了全部tweet內容,大部分的tweet內容都是在內存中。若是沒有的話,能夠經過select查詢將其拉回內存。與tweet內容相關的功能很是少,搜索就是其中一個,而Home timeline則徹底不關心。
1. 如何將這條數據的管道打造的更快更有效
2. 在5秒內作到tweet的擴散,可是並非時刻的奏效,特別是愈來愈多的高粉單位。
3. Twitter是非對稱的關注,只有你關注人的tweet纔會呈現給你。Twitter能夠從這些單向關注中獲取你更多的信息,有些單向關注一樣還影射出一些社會契約。
4. 問題通常發生在大基數的圖上:@ladygaga擁有3100萬粉絲,@katyperry擁有2800萬粉絲,@justinbieber擁有2800萬粉絲,@barackobama擁有2300萬粉絲。
5. 大批量粉絲的擁有者每發送一條tweet將形成數據中心大量的寫入操做,而隨着愈來愈多名人之間的交互,挑戰變得更加的艱鉅。
6. 這些須要擴散給大批量用戶的tweet是Twitter最大的挑戰,在關注這些名人的共同粉絲中,常常會出現回覆tweet比原文更早一步送達的狀況。他們在站點中引入競態條件,好比最近關注Lady Gaga的粉絲可能會比老早以前關注的粉絲早5分鐘看到tweet內容。好比說一個用戶先收到了tweet,並進行回覆,然而這時候Lady Gaga的原微博並無擴散完畢,這樣就會存在有些用戶先看到回覆的狀況,爲用戶形成很大的困擾。Tweet經過ID進行排序,由於他們大多數是單調遞增的,然而在如此粉絲規模下,這種作法並不奏效。
7. 尋找讀和寫途徑的合併,再也不作如此大規模的擴散;好比傳播Taylor Swift新生成的tweet,取代在生成時進行擴散tweet ID,而是在讀取時候就進行合併。經過平衡讀寫途徑,節省百分之幾十的資源。
解耦相關
1. 基於Twitter經過各類途徑傳播tweet,解耦可讓不一樣技術團隊獨立完成本身的工做。
2. 基於性能問題,系統也須要解耦。Twitter過去使用的一直是徹底同步模式,而在兩年前由於性能問題他們停用了這個模式。設備接收一個tweet須要145毫秒,接收完畢後就斷開全部客戶端鏈接,這麼作一樣也由於技術負債。寫的路徑由Ruby驅動,經過MRI實現,一個單線程服務器,每次Unicorn worker分配都會耗盡全部處理性能。每當有tweet流入,Ruby就會接收它,將它放到一個隊列中而後斷開連接。他們在每臺服務器上只運行45-48個進程,這樣的話每一個機箱能同時處理的tweet數量也是這麼多,因此他們必須儘量快的斷開鏈接。
3. 當下的tweet已經經過異步模式來處理,而這些討論也都是創建在異步之上。
監視相關
1. 系統性能實時儀表盤
2. 使用VIZ系統監視每一個集羣,請求Timeline Service並從Scala集羣獲取數據的平均時間爲5毫秒。
3. 基於Google Dapper系統的Zipkin,工程師能夠經過Zipkin對請求的細節進行監視,好比獲取請求所訪問的服務及請求時間,這樣就能夠獲知每一個請求的性能細節。這樣就能夠經過每一個階段耗費的時間對系統進行調試,一樣也能夠從整體上看從請求到交付耗費的時間。花費了兩年的時間,Twitter將活躍用戶的timeline降到2毫秒。
部分統計數據:
原文連接: The Architecture Twitter Uses to Deal with 150M Active Users, 300K QPS, a 22 MB/S Firehose, and Send Tweets in Under 5 Seconds (編譯/仲浩 審校/周小璐)
歡迎關注 @CSDN雲計算微博,瞭解更多雲信息。
本文爲CSDN編譯整理,未經容許不得轉載,如需轉載請聯繫market#csdn.net(#換成@)