阿里巴巴為了要監控Node.js系統的效能,自行開發一套效能監控工具Alinode,可以追蹤CPU用量和記憶體洩漏問題。(圖片來源/袁鋒)

淘寶網在2012年擁有4.5億用戶、600萬個賣家,當年12月12日舉行的雙十二活動,就有超過200萬名賣家參與,淘寶還推出專屬個人的消費歷程「淘寶時光機」,呈現過去10年的個人化專屬購買歷程,為了快速地從10年間的龐大消費記錄中,分析出個人的消費歷程,Node.js技術專家袁鋒袁鋒指出,當天此應用流量創下歷史新高,遠遠超過其他分析數據類型的產品。

所幸,早在前一年,阿里巴巴後端就改用Node.js開發,才能撐住這次暴增的流量,也因為淘寶經常舉行一次性的特別活動,像是雙11和雙12等促銷活動,需要更高效能的架構,來因應流量暴增的問題。

阿里巴巴在2011年開始導入網站開發框架Node.js,「測試完發現Node.js比PHP快至少5倍以上,就開始用了!」袁鋒表示,當時的技術負責人發覺Node.js技術,看中了簡單的特性,只有測試性地建了一個分析數據類型的產品,當時實測後發現後端採用Node.js的效能比PHP快,就開啟了阿里巴巴與Node.js的旅程。

袁鋒在螞蟻金服負責所有用Node.js技術開發的專案,他同時也是中文Node.js技術社群CNode.org的核心成員,由於他所屬的部門都是從事開發分析數據類型的產品,「數據產品屬於高I/O流量!」他表示,原本用PHP撰寫而成的架構,因為I/O流量持續增加,讓原本的架構不堪負荷。

阿里巴巴在2011年應用開發端導入網站開發框架Node.js,看準Node.js快速開發的特性,用Node.js開發應用展示層所需要的功能。圖片來源/袁鋒

Node.js最適合創造I/O密集型的應用

由於分析數據類型的產品屬於I/O密集型應用,為了要解決流量暴增的問題,非同步(Asynchronous)I/O就變成應用開發端重要的課題之一,系統必須可以同時處理多個 I/O 要求,來分散流量,但是,以往用PHP開發應用,很難達到這樣的目標。

他表示,從PHP改用Node.js的轉折,團隊當時嘗試建立一個分析數據類型的產品,效能提升許多,開發人員的接受度也很高,在正式發布第一個對外的公開產品前,阿里巴巴內部經過許多較小規模的試驗,最後,確定沒問題之後,才正式推出「淘寶指數」,之後又陸續推出數據魔方等數據型產品。

採用Node.js開發可從全新的創新應用著手

淘寶指數是全新的應用,袁鋒表示,一開始用Node.js來開發適合從全新的應用開始著手,「新手很容易就可以用Node.js寫出一個應用!」他一語點出Node.js的優點,由於Node.js擁有許多套件,開發功能的過程,可以省去不少時間,讓開發人員快速地從0到1打造出全新的應用,因此,Node.js適合配合創新,快速開發新應用。

一開始導入Node.js時,開發應用的IT團隊對Node.js都還不了解,過去只有用Python、Java和PHP建置應用服務的經驗,在團隊IT人員初步研究過後,都覺得Node.js簡單易上手。

Node.js快速開發的優勢,不只有利於前端的應用,對於內部開發人員的開發效率也有幫助,「Node.js對阿里巴巴而言,剛好是填補前端團隊人力不足的問題,」袁鋒解釋,以往,開發人員在開發應用的過程中,會用Java、Python等不同的語法,建立自己的開發工具,改用Node.js之後,開發人員在寫工具的效率上,大幅地提升,他認為,Node.js讓IT團隊有一個更好的合作模式,創造開發工具。

不過,他也坦言,當初天真地認為導入Node.js會是個簡單的工作,開始摸索之後,才發現困難重重,首先面臨的問題就是,Node.js如何融入阿里巴巴的原有Java生態系,袁鋒表示,當初為了要寫Node.js,卻整天都在研究Java的程式碼,他採用hessian.js和java.io兩項序列化協議,來串接Node.js和Java,跨語言的開發他則建議使用序列化資料結構方法Protocol Buffers。

技術瓶頸解決之後,還有另外一個問題,就是缺乏Node.js的工程師,「2011年時,Node.js還太新了!」他表示,當時就連資深的人事都沒有聽過Node.js,要招聘工程師更是難上加難,這也是袁鋒當初在CNode.org極力推動Node.js的原因,他認為要主動創造一個環境,讓更多人可以投入這個生態圈。

阿里巴巴Node.js技術專家袁鋒表示,Node.js非常適合用於開發I/O密集型的應用場景,不適合複雜且大型的應用。攝影/洪政偉

Node.js的局限是複雜且大型的應用

袁鋒表示,Node.js適合快速打造出全新的應用,相反地,Node.js的瓶頸點就是在產品發展的階段很適用,但並不是產品持續發展的優先選項,依照他的觀察,創新業務裡面,要從0到1用Node.js非常適合,但是要從1到100,就很難全用Node.js,他解釋,當應用慢慢壯大之後,必須切分成許多層,且業務邏輯會變得越來越複雜,而Node.js就不適合打造業務服務層。

舉例來說,用Java就可以很容易處理分散式交易,但是Node.js就很難實現,因此,他建議,企業應該想清楚系統架構每一層工程師的分工和擅長的工具,找到適當的場景,用對工具才是最重要的。

袁鋒舉例,阿里巴巴在嘗試用Node.js打造全新的應用後,也將目光轉向既有的應用數據魔方,當時該應用流量持續上升,他預計原本的架構將會無法招架,因此開始將原有的PHP架構轉成Node.js,但是,他就將系統架構分的很清楚,Node.js只負責應用展示層所需要的功能。

阿里巴巴打造自家的Node.js效能監測工具

由於阿里巴巴有許多流量大的應用,在幾年前阿里巴巴預期將來會有許多用Node.js打造的應用,可能會遇到和Java應用一樣的問題,於是,從原本的數據單位拆出一個團隊負責開發效能監測工具Alinode。

他舉例,過去沒有效能監測工具,發布新的程式碼時,CPU用量增加和記憶體的洩露問題,都無法準確追蹤是哪一行程式碼導致的問題,同一個應用發布兩個版本,CPU用量從15%增加到30%,開發人員只能找出可能有問題的程式碼來修改,再重新發布,若是CPU用量降下來,開發人員才可以確定是這行程式碼有問題。

袁鋒表示Google的開源JavaScript引擎V8所提供的監測工具也無法百分之百準確追蹤程式碼的問題,但是阿里巴巴開發的Alinode則是可以掌握8成以上的效能問題,可以自動提示某個函數使用的記憶體資源過多,也能直接顯示哪一個行數的程式碼需要修改。

袁鋒過去在CNode.org社群積極推動Node.js,剛開始只是為了創造Node.js生態圈,以利招募Node.js工程師,不過經過許多年頭後,他還繼續堅持經營社群,「有了這些交流,讓我們可以提前預防別的公司遇到的問題,」他表示,這是他認為最大的意外收穫,因為大家會在社群中分享實際用Node.js遇到的問題,讓其他人可以在遇到問題之前事先預防,形成良性循環。

袁鋒曾經以為Node.js是萬能的,慢慢地接觸到更多後端技術後,才發覺,應該要想清楚每個開發框架的優勢,善用它的優勢提升研發效率,他表示,現在他花更多時間在思考如何提升開發效率,若有更好的方案,未來可能也不排除換成別種語言。

阿里巴巴為了要監控Node.js系統的效能,自行開發一套效能監控工具Alinode,可以追蹤CPU用量和記憶體洩漏問題。圖片來源/袁鋒

熱門新聞

Advertisement