在互聯(lián)網(wǎng)行業(yè),基于Unix/Linux的網(wǎng)站系統(tǒng)架構(gòu)毫無疑問是當今主流的架構(gòu)解決方案,這不僅僅是因為Linux本身足夠的開放性,更因為圍繞傳統(tǒng)Unix/Linux社區(qū)有大量的成熟開源解決方案,覆蓋了網(wǎng)站應(yīng)用擴展的方方面面。 我記得十幾年前第一波互聯(lián)網(wǎng)浪潮的時代,采用Windows平臺ASP架構(gòu)的大型網(wǎng)站是非常普及的,而如今采用Windows平臺.net架構(gòu)的大流量知名網(wǎng)站已經(jīng)鳳毛麟角了。很多采用Windows平臺.net架構(gòu)的大型網(wǎng)站都面臨了架構(gòu)上的擴展問題: 例如國外的SNS網(wǎng)站MySpace網(wǎng)站面臨過很嚴重的性能擴展問題,國內(nèi)電商網(wǎng)站京東也不止一次受困于架構(gòu)擴展帶來了性能瓶頸。因此,一些Windows平臺.net架構(gòu)為主的網(wǎng)站,不得不考慮“去.net化”,拋棄.net,全面遷移到以Java為主的架構(gòu)上。 但是大型網(wǎng)站的架構(gòu)遷移,本身也是傷筋動骨的事情,風險極高,成功案例尚不多見,失敗案例俯拾皆是,這是因為:
5173“去.net化”的教訓5173網(wǎng)站以游戲裝備交易起家,曾經(jīng)在客戶端網(wǎng)絡(luò)游戲發(fā)展黃金時期,迎來了業(yè)務(wù)爆發(fā)性的增長期。此時,用.net架構(gòu)開發(fā)的網(wǎng)站已經(jīng)不堪重負,由于現(xiàn)有的.net研發(fā)團隊長期無法解決網(wǎng)站的性能問題,5173決定將網(wǎng)站從.net架構(gòu)全面遷移到Java為主的架構(gòu)上。為此,5173花了很大的代價,從淘寶和SUN公司挖了很多工程師,組成了一個六七十人的Java架構(gòu)研發(fā)部門。 新的Java研發(fā)部門開發(fā)新的5173網(wǎng)站,而老的.net研發(fā)部門維護現(xiàn)有的5173網(wǎng)站,兩個部門并行工作,兩個版本的網(wǎng)站并行運行,這帶來了公司內(nèi)部激烈的政治斗爭,新開發(fā)完成的Java版本的5173網(wǎng)站從未正式上線過,老的.net研發(fā)團隊在面臨嚴重生存威脅的情況下,努力解決了一些核心的可用性和穩(wěn)定性問題。同時隨著端游黃金時代的結(jié)束,網(wǎng)站性能問題也逐漸顯得不再重要。 在圍繞新版本網(wǎng)站是否要正式替換老版本網(wǎng)站的問題上,各個利益方爭執(zhí)不下,反反復(fù)復(fù)拉鋸戰(zhàn),而空降而來的女CTO不屬于任何派系,態(tài)度模棱兩可。最終斗爭的結(jié)果.net利益方戰(zhàn)勝了Java利益方,Java研發(fā)部門被清洗。 我的.net系統(tǒng)架構(gòu)改造的經(jīng)驗和教訓3年前,我剛接手CSDN的產(chǎn)品和研發(fā)團隊的時候,CSDN的核心系統(tǒng)大約2/3是Windows平臺.net架構(gòu),1/3是LAMP架構(gòu)。研發(fā)人員當時也很少:只有2個.net程序員,3個PHP程序員,后來還有1個我?guī)н^來的Ruby程序員。當時的計劃是:網(wǎng)站整體架構(gòu)改造的方向是Linux架構(gòu),逐漸替換掉現(xiàn)有的.net系統(tǒng)。因此不打算繼續(xù)招聘和補充.net程序員了,現(xiàn)有的.net程序員負責老的核心系統(tǒng)維護工作。 但碩果僅存的2個.net程序員在隨后不到半年時間都走了:一個.net程序員跟著微軟出來的高管去創(chuàng)業(yè),另一個.net程序員跳槽去百度做了前端工程師。這中間的道理也很簡單:既然公司要去.net化,那.net工程師就會擔心等到將來.net系統(tǒng)都換掉之后,自己在公司還有價值嗎,不就徹底邊緣化了嗎? 當然我在制訂架構(gòu)遷移計劃的時候,也考慮到了這一點:我給那個更資深的.net工程師制訂的是整個公司總架構(gòu)師的培養(yǎng)計劃,那個精通JS的.net工程師制訂的是未來前端團隊Leader的培養(yǎng)計劃。不過有不確性的承諾總是不如現(xiàn)實的威脅更迫切,所以我也特別能夠理解.net工程師的流失。 這個時候,我陷入了一個兩難的處境:
當時,我最初的想法是:招聘2名水平尚可,沒有太大上進心,可以安于現(xiàn)狀,踏踏實實工作的.net程序員來維護老的.net核心系統(tǒng);同時招聘和搭建ruby研發(fā)團隊,以我過去用ruby開發(fā)網(wǎng)站的驚人開發(fā)效率,爭取時間,逐一重寫老的.net核心系統(tǒng)。但是這樣做,風險也很大:
幸運的是,我招聘過程中,面試到了兩個相當不錯的.net工程師,有很強的上進心,編程功底和悟性都很好。雖然不符合我當時想找安于現(xiàn)狀的工程師的標準,但我又不太想錯過好的人才,所以我臨時改變了自己的想法,將他們招過來,組建了新的.net團隊。 為了避免出現(xiàn)之前.net團隊流失的問題,給新的.net團隊創(chuàng)造在公司發(fā)展的機會和空間,我想來想去,決定采取一個折衷的方案:即保留和沿用.net編程語言和框架,但是網(wǎng)站整體架構(gòu)仍然去Windows化,概要說來:
簡單說來,就是單純讓.net做應(yīng)用層的編程語言和框架,其他都交給Linux平臺的開源解決方案。而.net框架單純做應(yīng)用層,無論ASP.net MVC的開發(fā)效率,還是.net CLR虛擬機的運行效率都非常好,目前我們單臺Windows服務(wù)器上跑幾百萬的動態(tài)請求毫無壓力,而且應(yīng)用層架構(gòu)是可以橫向擴展的:如果請求負載非常高,只需要添加更多Windows服務(wù)器即可??傊龅搅藫P長避短。 此外,我也比較注重不同編程語言研發(fā)團隊之間的交流,鼓勵.net工程師熟悉Linux操作系統(tǒng),培養(yǎng).net工程師整體架構(gòu)意識。我們現(xiàn)在的主力.net骨干和我說,感覺來到這里以后技術(shù)上最大的提升就是視野一下被打開了。 在后來兩年的整個網(wǎng)站改造過程中,也證明了這樣的做法是相當成功的:
當網(wǎng)站架構(gòu)全面Linux化,并且架構(gòu)解決方案全部統(tǒng)一以后,其實在應(yīng)用層用什么編程語言來寫,就不是一件重要的事情了,我們目前應(yīng)用層現(xiàn)有產(chǎn)品線,既有.net,也有PHP和Ruby寫的,但是架構(gòu)都是統(tǒng)一的,用什么編程語言,主要取決于研發(fā)團隊資源的調(diào)配情況而定。 總之,以我的經(jīng)驗來說,一個傳統(tǒng)上嚴重依賴微軟解決方案架構(gòu)的網(wǎng)站,如果要進行架構(gòu)改造,遷移到Linux平臺,甚至用其他編程語言重寫,從來都不是一個單純的技術(shù)問題,它至少涉及如下幾個層面的問題:
一點題外話我感覺我們互聯(lián)網(wǎng)行業(yè)有一個不太好的現(xiàn)象:有些網(wǎng)站在促銷期間癱瘓了,有些網(wǎng)站經(jīng)常出現(xiàn)訪問不穩(wěn)定的現(xiàn)象,公司老板就喜歡跑到微博上來放狠話,請下屬喝茶,或者急就章的嚷嚷百萬年薪招CTO,這些都是很幼稚的做法。這就好比一個人,平常生活習慣差,花天酒地,從不注意養(yǎng)生,結(jié)果長年累月下來,終于病倒了。在這個時候狠狠的揮舞支票嚷嚷,哪個名醫(yī)能給我藥到病除,我給誰百萬報酬。 所以,當一個網(wǎng)站出現(xiàn)嚴重的技術(shù)問題,其根源往往都不是單純的技術(shù)問題,也不是單純換個CTO就可以藥到病除的,要反思公司企業(yè)文化是不是從來沒有重視過研發(fā),對技術(shù)團隊的激勵到位了嗎?對架構(gòu)師的意見重視過嗎?對未來可能面臨的技術(shù)門檻是否有過長期的研發(fā)投入? 關(guān)于這個現(xiàn)象,我記得Fenng說過一句很精辟的話:“技術(shù)問題,總是在短期被高估,在長期被低估”,我也想補充一句:“技術(shù)出現(xiàn)了問題,從來都不單純是技術(shù)導(dǎo)致的問題”。 |
|