//# Node.js基本簡介

  今天要講來講nodejs,node主要是由三個東西組成,第1個東西他用的語言Javascript,第2個東西是Google的V8,最後一個就是他幫他加了一層讀檔寫檔、輸入輸出的API,先來講Google V8,他是一個Javascript引擎,因為JS本身只是個語言,也就是規範,就是跟你講說該怎麼寫怎麼寫這樣子而已,如果沒有一個人來跑的話,那你寫這些東西就沒有用了,那就是要有個東西可以來跑Javascript,那大家知道瀏覽器要可以跑Javascript,就是瀏覽器裡面要有個程式可以跑Javascript,然後chrome用的這個就叫做V8 Javascript引擎,然後V8不是天生就長在chrome裡面,他自己有一個專案,有個project,然後有一群人自己在做這樣子,就是跟chrome沒有關係的,V8自己可以獨立跑,如果你在寫C的話,你也可以把它當一個函式庫拿來用,V8適用C和C++寫的,Node本身大部分的code也是C和C++這些,但是Javascript本身沒有輸入輸出,但現在有了V8可以跑,但是跑起來還是不能幹嘛,因為她還是什麼事情都不能做,不能讀檔寫檔,連跑起來你可能都看不到她在螢幕動還是幹嘛的,沒有輸入輸出的話就沒有用這樣子,所以Ryan Dahl就幫這個組合再加上一套輸入輸出的API,然後node就是他弄出來的

   Nodejs三個特點:Asynchronous、Event-driven、Non-blocking,以下有3行code:
var file = readFile("setting.txt");
console.log(file);
console.log("hello");
   大家可以發現這三行很普通的code可能覺得沒有什麼,但仔細去看這3行可以發現,執行這3行所花的時間不成比例,實際所花的時間比例可能相當誇張,大家都知道硬碟比記憶體還要慢很多很多,讀記憶體可能一下就讀完了,硬碟可能就還要在那邊跑,讀半天才能讀到東西,電腦裡面還有很多可以讀取寫入等等的輸入輸出所花的時間都不太一樣,硬碟跟記憶體的速度可能差到5個數量級,假如讀記憶體的某個東西需要10秒,讀硬碟可能就需要10萬秒(大概一天多),就上面三行code第1行要花很久很久,你還是要等第1行執行完才能執行下面的code,硬碟可能還好,如果讀取鍵盤可能就要等到死了,因為如果使用者不輸入你的程式就一直會卡在第1行,上面這種輸入輸出的方式就叫做Blocking I/O,就是會把後面要做的其他事情都塞住,要等前面做完才能坐後面。
  假設現在有一台網頁伺服器,可以想像成伺服器有人在等,這樣一個接線生,然後有瀏覽器去訪問他的話,就像有人打電話過來,接線生就把電話接起來,接下來就可能就去做一些事情,然後把網頁傳回去給他,然後像Blocking I/O就像前面的例子,有個接線生就一直在等鍵盤,一直等等到有人敲一個鍵的時候,他才能去做其他事情,然後如果你的網頁伺服器就像這個例子只有一個接線生在那邊等,那你的網頁只能服務一個人,只要有人打電話過來,那個接線生就在忙線中,就只能服務那個人,這樣就沒辦法同時服務很多人,然後傳統的解決方式,就是開很多個thread一起等,就像很多個接線生來幫你接電話一樣,然後如果有100個thread就可以同時服務100個人,大家應該都有點概念就是thread寫起來成本很高,會有一些dead lock等雜七雜八的問題,”那Nodejs的解決方法是:「老子不等你,等你好了再叫我,我先去做其他事情」,什麼意思呢,看下面寫法:
  //一樣要讀檔案
var file = readFile("setting.txt", function(data)
{
  //等到讀到了後,再繼續做想做的事情(event-driven)
  console.log(data);
});

console.log("hello");//不會等上一句先讀完,會先繼續往下做
//可以先偷跑
  再來是Event-driven: Node利用事件與callback來改變執行的時間與順序,輸入輸出都是用事件(Event-driven),用callback跟機器講說發生了再叫我,所以後面可以先跑,跳著執行,這種也就做Non-blocking,後面不會再塞住了,Asynchronous: 程式非同步,程式從開始到完成不在同一行,舉例來說:apache是使用blocking I/O,而nginx用的是Non-blocking I/O,另外補充一點,Node用Non-blocking I/O,像其他Python、Ruby,有很多其他non-blocking 輸入輸出的函式庫或框架,Ruby跟Python本身自己就有輸入輸出函式庫,原本傳統blocking的,有很多人幫他寫很多函數庫用的都是blocking的方法、但問題是說假如你現在想要在Ruby寫這種Non-blocking的東西的話.那你用寫的東西的話,你就要查出說那個函數庫是不是Blocking或者它使用的函數庫是不是Blocking,因為Blocking的特性就像老鼠屎一樣,你只要整鍋湯的其中有一個環節是Blocking的,那你整個湯或輸出就會塞死,那你在Ruby或Python寫的時候就要很小心。
  Nodejs的優點: 1.效能非常好 2.Scalibility也非常好 : Scalibility:你一台MySQL機器,100個人來用或1000人或一萬人來用都還可以,但是如果100萬個人來用的時候就不行了,那你這時候可能想說,那既然100萬人來用,我就開100台機器給他跑好了,但是問題不是那麼簡單,不是說問題的難度就直接100倍,你機器直接開100倍的量就可以解決,不會是線性的,你可能這時候就要開1萬台才能夠應付100倍的東西,像這樣的話scalibility就會不太好,就是你的架構不能擴展,沒有很好得擴展性 3.社群大: 有蠻多人拿它來寫東西 4.前後端可以用同一種語言。
Nodejs的缺點: 1.Single-threaded 如果你電腦有4顆核心,你node的只有用到其中一個,你就沒辦法用到其他資源了,你既然有4個核心,你就開4個node一起跑,或者使用其他人的函數庫 2. 太年輕: 輸入輸出的API變動大,API沒有很穩定

  以上為影片聲音節錄。
**P.S. / Reference:  NodeJS - OpenWebSchool

results matching ""

    No results matching ""