專刊內文

當前位置:首頁>專刊分享>內文

瀏覽次數 : 4132



 

EEP Node.JS 創世紀

訊光科技 / Andy Kao  

前言

經過了1年多的開發與努力,Node.JS的EEP版本終於要在2016年底前上市了,這也意味著從2017年開始,我們訊光要進入Node.JS的時代;當然,發展了10年的.NET是不可能中斷的,會隨著微軟與Visual Studio版本持續往下發展與支援,畢竟.NET的成熟度與普及化短時間是很難取代的,更難的是已經在.NET開發了無數的系統尚須往下維護,對於這個IT預算有限的大環境裡,降低風險與成本是件重要的事。


Why Node.JS

EEP平台為何要改用Node.JS呢,可不是因為Node很紅跟上流行,是基於下列幾個重點

● 跨平台:Node.JS是一個開放原始碼的執行環境,除了大家熟習的Windows與Linux上外,還可以在Mac OS,FreeBSD等其他知名的OS平台上執行,也因為是跨平台,可以讓Node所開發的系統不侷限市場與客戶群。

● 提升效率:這兩年來大型網站幾乎處處可見Node.JS的身影,主要是Node.JS的事件驅動與非阻塞I/O架構讓網站可以承受更多的用戶量,網站使用Node.JS的市占率年年升高,漸漸成為網站主流。當然,如果是企業應用系統,由於需要大量的資料庫存取,效能表現會受限於等待資料庫回應而無法感受明顯,但可以配合資料庫的優化來達到提升目的。

● 還樸歸真:多數的Web服務器與應用服務器的架構都不小,主要是考量服務器要面對可能的各種應用所架構成龐大系統;Node.JS的核心模組只要幾 M 的檔案就可以進行基本的運作了,如需要其他的功能,再以NPM(Node Package Manager)的方式將第3方(或是官方)的模組合併安裝嵌入即可,因此,Node.JS的架構非常精簡,需要甚麼額外功能再自行以NPM附加即可。

● 降低成本:不管是OS、伺服器、開發工具,有些需要授權費用,有些則不需要,使用Node之後,企業可以選擇Free授權的OS、伺服器、開發工具來降低企業成本。



Node的效能概念

怎麼說Node的事件驅動與非阻塞I/O架構的效能會必較快呢?我們就舉一個生活的例子,好讓大家理解,如下圖



如上面的左圖,假設有家速食店有5個櫃台5位前台服務生,結果同時來了50個客人,客人自動根據隊伍大小會排成5排,所以平均每個櫃台會排10人,只能耐心等待點餐付款,更需要耐心等待餐點到客人手上。

如上面的右圖,事件驅動的方式,就是改成1個櫃台(1個前台服務生)即可,每個客人入口只要拿一張訂購單,填寫訂餐內容交給服務生即可(餐後買單),這樣就沒有排隊的問題。也就是說只要收到服務請求交給後面的程序處理,不用親自處理其他的程序,這樣的效率自然大幅提升



非阻塞I/O,就是工序的問題,如上面的左圖,假設廚房內有3個工作人員,每個工作人員收到點餐請求之後,去準備餐點,這樣50個人的餐點恐怕要忙半小時才能完成,因為廚房工作人員只有3個,同一時間也只能處理3個客人的餐點。非阻塞I/O的概念是類似自動化廚房(如飲料機器、薯條機器、漢堡機器),如上面右圖的廚房工作人員可以根據訂單交給機器生產,並迅速處理下個客人的訂單,等機器完成(會有聲響,就是CallBack)再來交給櫃檯即可,這樣就不會造成大量訂單阻塞,提升生產效率。

透過這個生活實例,不難了解事件驅動就是要解決請求併發數問題,多人同時湧入網站後,可有效避免網站鎖死的現象;非阻塞I/O就是面對網站有爆量的I/O或資料庫存取動作時,Node可以在I/O處理的同時去異步處理其他工作,完成I/O工作再以事件通知Node,來防止發生Block的阻塞現象。


Node的限制

當然,Node.JS並非完美,除了網站系統Node已成為主流技術外,企業的應用系統並沒有見到很多的應用案例,原因分析如下:

●企業的IT應用多以成熟與穩定為主,Node.JS的技術太新,發展太快,版本過多,對於企業來說總是風險考量,觀望多於進取。

●Node的後端JS採用非同步(Asynchronous)與回調(CallBack)的寫法,對於傳統物件導向或程序語言的程式開發者來說,完全無法適應,通常程式會寫得很繞,不容易閱讀與維護,寫得不好的話還很容出錯,這也是有些團隊改用Node開發之後因為無法忍受習慣的差異而暫時擱置了下來。

●企業的應用系統核心,很多都與資料庫有關,Node雖然在User的併發數佔有絕對的優勢,但資料庫存取也是一種I/O阻塞(要等待資料庫回應),每個請求如果都需要資料庫來回應時,Node的優勢就沒有這麼明顯;另一個原因是很多資料庫的程序都是有次序性的,Node使用非同步執行簡直是個缺點,不懂的開發者會寫出Bug一堆的系統,還好EEP的Node已經做好了包裝,讓程式師在Server端寫的JS可以設為同步執行方式,不然就改用資料庫的Stored Procedure也是一個好辦法。

●Node雖以高效的V8引擎來編譯JS程式碼,但總不能與傳統的C++或C#這種編譯成機器語言相提並論,因此Node不適合在耗用CPU過重、大量高速運算的應用系統,如大量數學運算、影像處理、高複雜的商業運算、各種科學演算法等,這些應用還是用載入C++或C#所寫的dll方式,會比較有效率。



Node的企業應用

企業的應用系統,大約可以分為B2C/B2B/B2E三種,說明如下:

●B2C:企業面對消費者或一般使用者的系統,這些系統多數是由公司網站所提供,提供企業形象及對客戶的服務,包括行銷活動、會員管理、客服、線上購物、交易查詢等等。這幾年基於行動裝置的盛起,B2C已經開始由網站變成的APP的發展,也因為這樣,新開發的系統有越來越多系統開始使用Node的技術來發展。

●B2B:企業面對上游(廠商)或下游(企業客戶)的資訊整合系統,如供應鏈管理(SCM) 、EDI(數據交換)系統或提供客戶的下單、查詢生產進度、物料庫存等等的系統。這些系統會隨著供應鏈或企業生態即時微幅更正,早期都是用.Net或Java/PHP的技術所開發,在這種不景氣的時代中,通常僅作維護與微幅調整,鮮少重新建置整個系統,所以Node的應用相對偏低。

●B2E:企業面對員工(包括兼職)的資訊管理系統,最熟習的就是ERP、CRM、EIP系統,CRM與EIP這種網站型並且有高度的行動化需求,全面採用新技術改寫的比例較高,Node的應用也逐年提高;但最困難的是ERP系統,系統複雜、包袱沉重、維護成本高等,能保持維運就非常不容易了,更別說要重新替換或採用新技術。



結論

基於以上的狀況,要讓Node.JS進入企業確實還有一大段路要走,通常企業最珍貴的就是數據與資料,長久累積在資料庫中,系統的發展並無需大量以取代式來進行系統汰換更新,一來風險高,二來成本大;最好的方法就是進行跨系統整合,保留原來可以使用的舊系統,再發展局部的新系統去結合,這樣就不會有較長的開發時程與上線壓力。隨著App在企業的成熟應用與RWD潮流(一套系統面對多種裝置)下,是可考慮以Node來作為部分新系統的開發嘗試,除了可以來滿足企業現代化IT需求外,更能透過Node的架構慢慢節省企業的軟體授權及維護成本,用最小的IT預算創造最高的IT產值與效率。