計劃名稱 : 104 年度教育部資通訊軟體創新人才推升推廣計畫跨校資源中心 : 雲端運算 ( 國立中山大學 ) 課程名稱 : 網路及平台服務 Part1 - 課程教材 教材名稱 : Node.js 介紹 國立高雄大學資訊工程學系張保榮教授
大綱 Node.js 介紹 事件驅動 ( Event-driven ) 同步和非同步 I/O Node.js 的優勢與好處
Node.js 介紹 Node.js 是一個應用程式開發框架, 以 Javascript 為基礎, 使用效能強大的 Google V8 Javascript 引擎, 大都用於編寫伺服器端和網路相關應用, 具有強大的可擴充性, 以及事件驅動 ( Event-Driven ) 和高乘載的特性, 自 2009 年公開發表以來短短幾年,Node.js 一躍成為現今最紅的新興技術之一 V8 Engine 為 Google Chrome 內建 Javascript 引擎
Node.js 介紹 ( 續 ) Node.js 之所以成功很大一部分歸功於它選擇了許多開發人員所使用的 Javascript 為基礎, 由於 Javascript 的支持者眾多, 他們可以快速地上手 Node.js Javascript 早期一直被當作網頁的前端 ( client 端 ) 語言來使用, 在用戶端的瀏覽器上執行, 如今 Node.js 便是將 javascript 應用在網頁的後端, 讓伺服器端也可應用 Javascript 語言是 Node.js 中最重要的語言
Node.js 介紹 ( 續 ) Node.js 走紅的另一個原因, 就是 Javascript 的事件驅動 ( Event-driven ) 之特性, 恰好可以在網站後端應用產生強大的效益和功能 Node.js 不需要依靠 Apache 等其他 server 套件, 本身就可以做為伺服器運行 ( Server 自己寫, 並使用 Node.js 運行 )
Node.js 介紹 ( 續 ) 總結來說,Node.js 不但讓 Javascript 引擎獨立, 不需要再倚靠瀏覽器執行之外, 也設計了一系列的核心模組, 擴充了許多 Javascript 語言沒有的強大功能 ( 底層使用了 C 語言 ), 例如 : 模組機制 檔案系統存取 網路存取 程序控制 Node.js 架構圖例
Node.js 介紹 ( 續 ) Node.js 使 Javascript 從此脫胎換骨, 不單單只是瀏覽器上的前端腳本語言, 使用 Node.js, 開發者完全可以運用 Javascript 開發各類型的應用程式 介紹了這麼多 Node.js 的特性, 核心主要都建構在 Javascript 的運用上, 在 Node.js 中, 開發者必須對於 Javascript 有相當深度的瞭解
事件驅動 ( Event-Driven ) 一般 C 語言中的函式, 皆須按照程式碼內容順序執行, 就相 當於一個寫好的腳本, 有著固定的順序, 此一程式設計方式 稱為 批次程式設計 事件檢查示意圖, 若事件 A 發生, 則調用事件處理函式 Handler(), 而 Event_catch() 是一個檢查函式 Javascript 本身便有事件驅動和非同步之特性, 所以我們常常可以在程式碼中看到非同步的開發模式 事件的檢查一般來說可以視為一個 While(true) 迴圈, 迴圈內容不斷檢查是否有事件產生, 若是見觸發則調用處理函式
事件驅動 (Event-Driven) ( 續 ) 一般情況下此種檢查會造成阻塞 ( 陷入迴圈之中 ) 但 Javascript 非同步的特性此檢查只在後端執行不會造成阻塞 事件驅動概念便是, 事件發生才執行某段程式碼, 實作原理為, 函式交由後端的事件引擎在背景執行 ( 監聽事件是否發生 ), 並設定一個回呼函數 ( Callback Function ), 當事件觸發時, 才回呼主要程序處理, 不讓它影響和阻塞 ( Block ) 目前正在運行的程式
事件驅動 (Event-Driven) ( 續 ) 在事件驅動和非同步的特性下我們不需要自行設定一個無窮迴圈或是輪詢 ( Polling ) 手段, 去檢查一個輸入或是事件, 造成阻塞 非同步的機制即為將可能需要長時間等態之工作 ( 如 :I/O ) 交由後端執行, 當執行完畢再回呼主程序, 避免阻塞 圖形化介面便是事件驅動的代表之一, 例如當滑鼠點擊某物件時 ( 事件發生 ), 系統才做出相對應的處裡
同步 (Synchronous) I/O 同步 I/O 為當有 I/O 工作產生時, 程序停擺等待 I/O, 此時執行緒閒置等待, 等待 I/O 完成才處理資料, 造成 CPU 會閒置導致產程不佳 當有大量連線湧入時, 傳統同步機制的伺服器對每個請求進行處裡, 且一個程序一次只能處理一筆連線, 若連線一多, 且每個連線皆須做 I/O 工作 ( 操作資料庫等 ),CPU 會等待大量 I/O, 導致效能低落 所以傳統伺服器會開啟大量的程序去應付大量的連線, 而此舉也會造成伺服器端 CPU 沉重的負擔
非同步 ( Asynchronous ) I/O 非同步 I/O 則與同步相反, 若有 I/O 作業則將其丟到後端去等待 I/O, 原程序不做等待, 可以去做其他服務,I/O 工作結束會回呼主程序, 主程序才中斷目前工作進行運算處理 非同步 ( Asynchronous ) I/O 機制相當適合用於網站服務, 相較於其他採用同步 ( Synchronous ) I/O 機制的 Web server, 能更有效率的處理大量高併發的即時應用
非同步 ( Asynchronous ) I/O 若引入非同步機制, 伺服器接受請求後, 不等待任何 I/O 作業, 而是丟到後端, 所以伺服器 CPU 不會有過多的閒置, 如此一來 Server 便可直接服務下一筆連線, 當 I/O 工作完成後會回呼主程序, 主程序才進行處裡, 而不是閒置等待 I/O
若使用同步 (Synchronous)I/O
單執行緒同步 I/O 處理一筆連線還可以應付
若有多筆連線進入, 則會造成後方連線需等待
應付多筆連線可開多個執行緒處理以加快速度, 但還是有可能需要等待
若產生太多執行緒則會造成效能低落
可以增加伺服器端的機器, 或是換更強大的 CPU, 但需要大量的金錢
然而 CPU 到底在做甚麼呢? 是 CPU 運算的工作? 還是單純的等待 I/O 運作 (CPU 閒置等待 I/O, 沒有在做事 )?
若使用非同步 (Asynchronous)I/O
在非同步 I/O 機制下, 伺服器接收到連線後, 不需等待任何 I/O 作業, 只在後端做等待 伺服器可以在把工作放到後端後, 立刻服務下一個連線, 不等待 I/O 所以效能提高
當真正需要 CPU 運算時, 才呼叫回呼函式執行運算, 否則不佔用 CPU
Node.js 的優勢與好處 統一前後端的開發經驗 : 前後端皆使用 Javascript, 只需要一中語言的經驗即可完成前後端的開發, 不須再學習其他語言與法, 能使開發者更專注於應用開發 強大的效能 : 使用強大的 Google V8 Javascript Engine, 事件驅動及非同步 I/O, 於伺服器端可發揮強大的效能
Node.js 的優勢與好處 ( 續 ) 數以萬計的第三方模組支援 : 官方線上公開的模組達十萬以上之數, 其中的功能範疇相當廣泛, 網站服務 桌面應用 甚至嵌入式系統和硬體控制都有各種模組支援, 幾乎涵括所有軟體領域 跨平台的支援 : Node.js 可在 Windows Linux Mac 上安裝使用 這也代表者 Node.js 所開發的程式也同樣可以在各種不同平台上執行 Node.js 在 ARM 架構的嵌入式硬體平台上, 也運行的相當好
END