在本文開始之前,先來看看一些案例。
一、這些公司為什么要如此“折騰”
關(guān)于技術(shù)棧的選擇和遷移,并不是幾個簡單的原因就能說清楚的,也并不是說新的技術(shù)棧就比老的技術(shù)棧要優(yōu)秀很多,其實(shí)每種技術(shù)都有存在的理由,并在特定領(lǐng)域內(nèi)有其強(qiáng)大的優(yōu)勢的,當(dāng)然也有缺點(diǎn),比如 C的性能很高,但是開發(fā)效率較低;Java的功能強(qiáng)大,但是沒有Ruby簡單靈活。
那么這些公司為什么要如此折騰呢?下面以一些公司的實(shí)際案例,僅列出一些主要、常見的原因。
1. 速度、可維護(hù)性――Groupon從Rails轉(zhuǎn)向Node.js
為什么要放棄原有技術(shù)棧?
Groupon目前在全球共有兩套站點(diǎn)――美國網(wǎng)站和歐洲網(wǎng)站,其美國網(wǎng)站前端最初是一個單一的Rails(最流行的Ruby開發(fā)框架)代碼庫。對于為什么會選擇Rails來開發(fā)最初的網(wǎng)站,Groupon開發(fā)人員表示,Rails非常適合小型團(tuán)隊(duì)快速開發(fā),可以讓網(wǎng)站快速啟動并運(yùn)行起來,這對于初期功能不斷變化的Groupon來說,是個非常不錯的選擇。
隨著Groupon的發(fā)展和新產(chǎn)品不斷推出,這個代碼庫越來越大,有太多的開發(fā)者在同一個代碼庫工作,他們很難在本地運(yùn)行并測試產(chǎn)品,如果有問題需要回滾,那么每個人的工作都前功盡棄了。
Groupon團(tuán)隊(duì)決定將原有的單一Rails庫分割成小的、獨(dú)立的、更易于管理的庫。
為什么選擇Node.js?
Groupon團(tuán)隊(duì)評估了不同的軟件棧,想尋找一個能夠解決這些問題的方案――有效處理大量傳入的HTTP請求、使并行API請求服務(wù)于每一個HTTP請求、將結(jié)果渲染為HTML5,并可以有效實(shí)現(xiàn)監(jiān)控、部署和支持。
該團(tuán)隊(duì)使用不同的軟件棧開發(fā)了原型,并測試了它們,總體來說,發(fā)現(xiàn)Node.js是個非常適合的解決方案。
如何遷移?
Groupon團(tuán)隊(duì)使用Node.js重建了網(wǎng)站頁面的每個主要部分,將它們作為一個獨(dú)立的Node.js應(yīng)用程序,然后重建了基礎(chǔ)設(shè)施,使所有獨(dú)立的應(yīng)用程序可以一起工作。遷移之后,Groupon成為了全球最大的Node.js部署產(chǎn)品之一。
遷移帶來的好處
更詳細(xì)的信息可參閱 Groupon開發(fā)團(tuán)隊(duì)的博客。
2. 原有技術(shù)棧已無法滿足如今的規(guī)模――Twitter部分服務(wù)從Rails遷移到了JVM
Twitter在2006創(chuàng)建初期也是基于Ruby on Rails開發(fā)的,其架構(gòu)設(shè)計(jì)也是完全可以應(yīng)付當(dāng)時的訪問量。但是隨著Twitter的快速發(fā)展,在每秒上萬訪問量的處理上,原有架構(gòu)開始出現(xiàn)各種性能問題,比如Twitter開源負(fù)責(zé)人Chris Aniszczyk稱,在2010年世界杯期間,球員進(jìn)了一個球或者得到紅黃牌,網(wǎng)站就宕機(jī)了。
為了解決這個問題,Twitter急需開發(fā)一個全新的架構(gòu),以應(yīng)付現(xiàn)在越來越大的訪問量。對于Twitter為什么從Rails轉(zhuǎn)向JVM語言,來看看Ruby創(chuàng)始人松本行弘是如何說的。
Twitter剛開始開發(fā)的時候不可能考慮到會有現(xiàn)在這樣大的訪問量,可以說現(xiàn)在的Twitter發(fā)展到當(dāng)初在設(shè)計(jì)上的極限了。
一個網(wǎng)站在遇到設(shè)計(jì)極限的時候,有很多解決方法,比如重寫架構(gòu)、換其他語言等等,他們的工程師想要挑戰(zhàn)一些新的東西,就提出要改用Scala,因?yàn)镾cala是編譯型語言,性能也不錯,正好適合編寫新的架構(gòu),我覺得這樣也不錯。
在我看來,在網(wǎng)站所提供的服務(wù)還沒有完全成型的時候,最重要的是能夠?qū)π枨蟮淖兓龀隹焖俚姆磻?yīng),這個時候就需要Ruby這樣靈活性比較高的語言;而在網(wǎng)站獲得成功之后,遇到了設(shè)計(jì)瓶頸,用一種新的語言,比如Scala,來編寫一個新的架構(gòu),以節(jié)約一定的資源,我認(rèn)為這也是很好的一個結(jié)果。Twitter轉(zhuǎn)向Scala還只是在其核心部分,而在Web前端和一些內(nèi)部工具上還有很多地方在用Ruby。
此外Twitter還將一些后端服務(wù)使用Java和 Clojure(基于JVM的Lisp方言)進(jìn)行了重寫,其基礎(chǔ)設(shè)施也采用了一些開源項(xiàng)目。
遷移后,Twitter在美國總統(tǒng)競選期間沒有出現(xiàn)宕機(jī)。目前Twitter每秒處理約6000條消息,加起來每天處理超過5億或每周35億條消息。
3. 技術(shù)上更可控,規(guī)模上更易擴(kuò)展――淘寶去IOE
2010~2013期間,阿里巴巴逐步完成了“去IOE”運(yùn)動,將“IBM小型機(jī)+Oracle數(shù)據(jù)庫+EMC2存儲”架構(gòu)逐步轉(zhuǎn)向了“MySQL+PC Server”。
至于阿里巴巴為什么要“去IOE”,阿里技術(shù)保障部DBA負(fù)責(zé)人周寶方表示主要從以下幾個因素考慮:
“去IOE”之后,阿里的技術(shù)架構(gòu)非常靈活,支撐了業(yè)務(wù)的快速發(fā)展,比如在雙十一,阿里可以很淡定地做業(yè)務(wù)擴(kuò)展;其次是阿里掌握了技術(shù)自主可控操作;另外還包括基礎(chǔ)工程技術(shù)和人才的積累、技術(shù)的沉淀、成本、安全性的提升等等。
詳細(xì)信息可參閱《 阿里周寶方談“去IOE”戰(zhàn)略及實(shí)施》。
4. 快速開發(fā)需要――PayPal使用Node.js重寫其支付系統(tǒng)
PayPal 公司長期存在著“ 非我所創(chuàng) ”的文化,這導(dǎo)致 PayPal 采用新技術(shù)的態(tài)度很消極,項(xiàng)目開發(fā)進(jìn)度也極其緩慢。正是由于 PayPal 行動緩慢,其他支付服務(wù)商 Stripe 和 Square 趁機(jī)成長,逐漸撼動 PayPal 的市場地位。同時,PayPal 當(dāng)時的開發(fā)技術(shù)也已經(jīng)無法滿足快速開發(fā)的需求,因?yàn)楫?dāng)時的開發(fā)基本全是 Java,不需要用 Java 來實(shí)現(xiàn)的也會用 Java 完成。
2012年4月,David Marcuss成為 PayPal 的總裁后,任命工程師團(tuán)隊(duì)重寫支付系統(tǒng),最終,工程師團(tuán)隊(duì)用了8周時間完成了該項(xiàng)任務(wù),他們選擇了Node.js和一些開源項(xiàng)目對系統(tǒng)進(jìn)行重新開發(fā),最終他們將這一技術(shù)棧整合成了一個 快速開發(fā)框架――Kraken,以實(shí)現(xiàn)公司其他產(chǎn)品的快速開發(fā)。
5. 追隨潮流,但這是有代價的――轉(zhuǎn)向HTML5
HTML5 是應(yīng)用開發(fā)領(lǐng)域的未來趨勢,由于其跨平臺性,一些企業(yè)也開始將應(yīng)用使用HTML5重寫。
比如Facebook和LinkedIn采用HTML5重寫其iOS客戶端。但是他們也付出了一定的代價――由于用戶的網(wǎng)絡(luò)環(huán)境并沒有預(yù)想的那么好,結(jié)果導(dǎo)致應(yīng)用啟動、瀏覽信息流、打開圖片都比較慢,因此他們后來又放棄該技術(shù),轉(zhuǎn)而使用蘋果的iOS SDK重新構(gòu)建,由于是本地應(yīng)用,速度提升非常明顯。
當(dāng)然,這并不是說HTML5不好,而是時機(jī)還未成熟。
6. 成本考慮――選擇開源軟件
由于昂貴的成本,開源軟件往往是小型初創(chuàng)公司的首選。比如服務(wù)器方面:
7. 更換技術(shù)團(tuán)隊(duì)或CTO
有這樣一種情況存在,比如原有代碼庫相關(guān)開發(fā)者大部分都離職了,且相關(guān)工作沒有交接好,文檔又不全,導(dǎo)致現(xiàn)有的開發(fā)人員難以維護(hù),或者現(xiàn)有開發(fā)人員認(rèn)為原有代碼“壞味道”太多,不愿意維護(hù),所以團(tuán)隊(duì)一拍即合,重寫架構(gòu)。
也有可能公司更換CTO后,公司的原有架構(gòu)不是新CTO所熟悉的,而且他認(rèn)為原有架構(gòu)有一定的問題。
8. 被迫選擇
如果公司正使用的某些產(chǎn)品的原開發(fā)者不再提供支持,那么只能尋找其他替代品。
還有就是在特定平臺上,你只能選擇某個技術(shù)棧,比如iOS開發(fā),你只能選擇Objective-C(當(dāng)然也可以選擇其他跨平臺開發(fā)工具,但是性能上比不上原生應(yīng)用)。
二、大公司是如何做的
在技術(shù)棧的選擇和遷移上,大公司會非常慎重,不僅要考慮新的技術(shù)棧是否能解決現(xiàn)有的問題,還需要從公司戰(zhàn)略(比如發(fā)展方向)、技術(shù)發(fā)展局勢(比如移動化、云端化)方面考慮。
1. 不斷嘗試新技術(shù)棧――Groupon
遷移現(xiàn)有架構(gòu)或技術(shù)棧,需要大量的人力和其他資源,此外,為一個線上產(chǎn)品更換底層設(shè)施需要非常高的技術(shù),比如有人將淘寶去IOE比喻成在公路上為一個高速行駛的汽車更換輪胎。
一些公司的開發(fā)團(tuán)隊(duì)會嘗試不同的技術(shù)棧,制作出原型并進(jìn)行測試,以此來看是否滿足需求。
除了做好預(yù)備工作外,開發(fā)團(tuán)隊(duì)還會選擇先遷移部分應(yīng)用或服務(wù),小步前進(jìn),并在此過程中,快速驗(yàn)證新技術(shù)棧的適用性,并及時反饋,以便能夠發(fā)現(xiàn)問題后快速回滾。
2. 優(yōu)化原有技術(shù)棧――Facebook
當(dāng)然,也有一些公司不愿放棄原有的技術(shù)棧,比如 Facebook,轉(zhuǎn)而在原有技術(shù)棧的基礎(chǔ)上進(jìn)行優(yōu)化。
Facebook的前臺主要使用PHP編寫,盡管PHP編程效率高,能夠支持產(chǎn)品的快速迭代,但是與傳統(tǒng)的編譯語言相比,腳本語言在CPU和內(nèi)存使用率上不夠好,隨著Ajax技術(shù)的廣泛采用,加上SNS對動態(tài)要求較高,這些缺點(diǎn)更顯得突出。
自2007年以來,F(xiàn)acebook嘗試使用多種不同方法解決這一問題,比如使用另一種語言重寫Facebook、重寫PHP的核心部分Zend引擎,但最終還是沒有獲得所需的性能。
于是HipHop for PHP誕生了,該項(xiàng)目由一個PHP到C++的轉(zhuǎn)換程序、一個重新實(shí)現(xiàn)的PHP運(yùn)行庫和許多常用PHP擴(kuò)展的重寫版本構(gòu)成,可大大加速和優(yōu)化PHP應(yīng)用。據(jù)悉,由于HipHop,F(xiàn)acebook Web服務(wù)器上的CPU使用率平均減少了50%。
3. 也有失敗案例
當(dāng)然,在技術(shù)棧遷移過程中,也有失敗的案例,比如5173網(wǎng)站從.NET轉(zhuǎn)向Java以失敗告終。詳細(xì)信息可見范凱 《對.NET系統(tǒng)架構(gòu)改造的一點(diǎn)經(jīng)驗(yàn)和教訓(xùn)》。
三、如何選擇技術(shù)棧
選擇技術(shù)棧需要參考的因素有很多,一些基本因素如下:
對于實(shí)際上該如何選擇,華為開源支持平臺專家莊表偉給出了他的建議。莊表偉認(rèn)為:
在快速原型的階段,就可以選擇快速開發(fā)的語言,而在實(shí)用的階段,就應(yīng)該選擇更加實(shí)用的語言。而在一些極端的領(lǐng)域,效率至上與實(shí)用至上可以毫不相干,各自有所追求,前期追求效率的開發(fā)產(chǎn)品,由于成本極低,大多是可以隨時拋棄的。而真正的困難在于想要兼得。常見的與架構(gòu)相關(guān)的兩種痛苦:
莊表偉認(rèn)為想要兼得魚和熊掌的確困難,但是并非沒有可能,我們可以找到一些優(yōu)秀的、可選的技術(shù)集合,對于技術(shù)選型的判斷,需要考慮理論情況與實(shí)際情況:
考慮效率
考慮實(shí)用
詳細(xì)信息可參閱《 技術(shù)選型:效率至上與實(shí)用至上》。
四、看頂尖互聯(lián)網(wǎng)企業(yè)的技術(shù)選型
下面來看看大型互聯(lián)網(wǎng)公司的產(chǎn)品是如何選擇技術(shù)棧的。該數(shù)據(jù)來自 維基百科,這是根據(jù)網(wǎng)站的HTTP頭信息和文件類型所統(tǒng)計(jì)的。
網(wǎng)站 | 前端 | 后端(服務(wù)端) | 數(shù)據(jù)庫 |
Google.com | JavaScript | C、C++、Go、Java、Python、PHP | BigTable |
Facebook.com | JavaScript | PHP、C++、Java、Python、FBML,Ajax,Erlang、D、Xhp | MySQL |
YouTube.com | Flash、JavaScript | C、Python、Java | MySQL |
Yahoo | JavaScript | PHP | MySQL |
Live.com | JavaScript | ASP.NET | Microsoft SQL Server |
MSN.com | JavaScript | ASP.NET | Microsoft SQL Server |
Wikipedia.org | JavaScript | PHP | MySQL,MariaDB |
Blogger | JavaScript | Python | BigTable |
Bing | JavaScript | ASP.NET | Microsoft SQL Server |
Twitter.com | JavaScript | C++、Java、Scala | |
Wordpress.com | JavaScript | PHP | MySQL |
Amazon.com | JavaScript | Java、J2EE、C++、Perl | |
eBay.com | JavaScript | Java | Oracle Database |
Linkedin.com | JavaScript | Java、Scala |
五、寫在最后
技術(shù)棧是產(chǎn)品的根基,是產(chǎn)品功能和用戶體驗(yàn)的保障。每種編程語言和技術(shù)都有存在的理由,且這些技術(shù)棧都經(jīng)過了時間和大型項(xiàng)目的驗(yàn)證,但這并不代表別人能用你就也能用,還需要根據(jù)產(chǎn)品、團(tuán)隊(duì)、市場等因素選擇最適合的技術(shù)棧。所以,在技術(shù)棧的選擇上,可以說沒有最好,只有最適合。希望本文列舉的這些公司的案例能夠?yàn)槟銕硪恍﹨⒖肌?/p>