程序員必看:性能大幅度提升的Twitter新系統(tǒng)架構(gòu)
2013年8月3日《天空之城》在日本的熱播創(chuàng)下每秒新增143119條推文的Twitter峰值記錄,是Twitter平均每秒發(fā)推數(shù)(TPS)5700條的25倍。
值得注意的是,在這次毫無(wú)征兆的“洪峰”到來(lái)時(shí),Twitter全新的系統(tǒng)平臺(tái)并沒(méi)有被潮水般涌來(lái)的推文堵塞而產(chǎn)生任何延遲甚至宕機(jī)。

Twitter舊架構(gòu)與新架構(gòu)的性能對(duì)比
僅僅三年前,在2010年世界杯上,一個(gè)點(diǎn)球和一張紅牌產(chǎn)生的“推文風(fēng)暴”都可能導(dǎo)致Twitter服務(wù)暫時(shí)失去響應(yīng),號(hào)稱地球脈搏的Twitter 經(jīng)常“心肌梗塞”。過(guò)去三年Twitter的工程師們夜以繼日的工作,試圖用“縫縫補(bǔ)補(bǔ)”的方式完善Twitter系統(tǒng),但最終隨著Twitter的快速 發(fā)展,這些方法的收效轉(zhuǎn)瞬即逝。
最終,Twitter痛下決心重新架構(gòu)為人詬病的IT系統(tǒng),新平臺(tái)上線運(yùn)行后在性能和可靠性上都取得的翻天覆地的進(jìn)步。無(wú)論是《天空之城》熱播還是超 級(jí)碗決賽都沒(méi)能卡住Twitter,而且新的架構(gòu)也為Twitter推出多媒體推文卡片,跨設(shè)備消息同步等新功能的推出提供了有力的支撐。
最近,Twitter平臺(tái)工程副總裁Raffi Krikorian(@raffi)在Twitter官方博客 撰文分享了Twitter新架構(gòu)的方法和經(jīng)驗(yàn),摘要如下:
重新架構(gòu)的緣由與問(wèn)題癥結(jié)
2010年世界杯多次卡殼后,我們重新審視了系統(tǒng),有以下幾點(diǎn)發(fā)現(xiàn):
我們運(yùn)行著全球最大的Ruby on Rails應(yīng)用,200名工程師負(fù)責(zé)開(kāi)發(fā)運(yùn)維這個(gè)系統(tǒng),但隨著用戶規(guī)模和服務(wù)數(shù)量的快速增長(zhǎng),系統(tǒng)所有的數(shù)據(jù)庫(kù)管理、Memcache鏈接以及公共API 的代碼屬于同一個(gè)代碼庫(kù)。這給工程師的學(xué)習(xí)、管理和并行開(kāi)發(fā)都帶來(lái)巨大困難。
我們的MySQL存儲(chǔ)系統(tǒng)已經(jīng)遇到性能瓶頸。整個(gè)數(shù)據(jù)庫(kù)中到處都是讀寫(xiě)熱點(diǎn)。
通過(guò)添置硬件已經(jīng)無(wú)法解決根本的系統(tǒng)問(wèn)題——我們的前端Ruby服務(wù)器每秒處理交易的數(shù)量大大低于我們的預(yù)期,也與其硬件性能不成比例。
從軟件的角度看,我們陷入了“優(yōu)化的陷阱”。我們是在犧牲代碼庫(kù)的可讀性和靈活性來(lái)?yè)Q取性能和效率。
重新檢視系統(tǒng),并設(shè)定三大目標(biāo)/挑戰(zhàn)
一、新架構(gòu)必須在性能、效率和可靠性上表現(xiàn)優(yōu)異,減少延遲大幅提升客戶體驗(yàn);同時(shí)將服務(wù)器數(shù)量減少到原來(lái)的十分之一;新系統(tǒng)能夠隔離硬件問(wèn)題防止其演變?yōu)榇笠?guī)模宕機(jī)。
二、解決單一代碼庫(kù)的種種弊端,嘗試松耦合的面向服務(wù)模型。我們的目標(biāo)是鼓勵(lì)封裝與模塊化的最佳實(shí)踐,但這次是在系統(tǒng)層面,而不是類庫(kù)、模塊和數(shù)據(jù)包的層面。
三、最重要的是能夠支持新功能的快速發(fā)布。我們希望能夠由一些充分授權(quán)的小團(tuán)隊(duì)能做出自主決策,并獨(dú)立發(fā)布一些用戶功能。
我們?cè)趧?dòng)手前部分開(kāi)發(fā)了一些概念驗(yàn)證模型,最終我們確定了重建的原則、工具和架構(gòu)。
系統(tǒng)重建的關(guān)鍵措施
一、前端服務(wù):用JVM取代Ruby VM。通過(guò)重寫(xiě)代碼庫(kù)將Ruby VM服務(wù)移植到JVM,性能提高了10倍,如今性能達(dá)到 10-20k請(qǐng)求/秒/主機(jī)。
二、編程模型:按服務(wù)類型對(duì)系統(tǒng)進(jìn)行結(jié)構(gòu),建立一個(gè)統(tǒng)一的客戶端服務(wù)器庫(kù)并與負(fù)載均衡、故障轉(zhuǎn)移策略等綁定,從而讓工程師們能更加專注于應(yīng)用和服務(wù)界面。
三、采用SOA面向服務(wù)架構(gòu),使并行開(kāi)發(fā)成為可能。
四、推文的分布式存儲(chǔ)。即使將整塊單一應(yīng)用分解成不同的“服務(wù)”,存儲(chǔ)依然是個(gè)巨大的瓶頸。過(guò)去Twitter采用的單一MySQL主數(shù)據(jù)庫(kù)只能線性 寫(xiě)入推文,Twitter決定在推文的存儲(chǔ)上采用全新的分區(qū)策略,用Gizzard框架創(chuàng)建容錯(cuò)的分片分布式數(shù)據(jù)庫(kù)存儲(chǔ)推文,但這樣一來(lái)就沒(méi)有辦法使用 MySQL的唯一ID生成功能。Twitter用 Snowflake解決了這個(gè)問(wèn)題。
五、監(jiān)測(cè)與統(tǒng)計(jì)。將單一應(yīng)用轉(zhuǎn)化為復(fù)雜的SOA應(yīng)用后,需要購(gòu)買匹配的工具才能夠駕馭。Twitter的服務(wù)推出速度很快,同時(shí)還需要實(shí)現(xiàn)數(shù)據(jù)化的決策支持,Twitter的Runtime系統(tǒng)團(tuán)隊(duì)為工程師開(kāi)發(fā)了兩個(gè)工具Viz和 Zipkin。