2015年11月3日 星期二

Node.js 的發明人 Ryan Dahl 在 Yahoo 介紹 Node.js (2010)


Node.js主要專注在Performance。Node的特點是對I/O有特別的處理方式,特別快。

在有100個client下,每次回應1MB的Benchmark
node  822 reqs/secs
nginx 7xx reqs/secs
others  1x reqs/secs

node用javascript寫,但居然跑的比純C寫的nginx還要快!!! nginx快的原因是它不用一個Process來接處理一個 client,而是用Event Loop。

All about non-blocking I/O

non-blocking I/O:   L1 / L2 / L3/Memory <             250 cycles
blocking I/O:          disk / network           > 41,000,000 cycles (ex: select .. from database)

應該用不同的方式來處理這兩種I/O,他們從根本上根本不一樣。L1 cache像是拉開抽屜拿東西,存取memory像是到樓下買個東西回來,但從硬碟上拿東西像是跳上飛機、飛到地球的另一邊再飛回來一樣。

要用non-blocking I/O,就要全部的API Call都用non-blocking I/O,即時用了第三方的程式庫去存取資料庫,可能就變成blocking I/O了。要實現的方法有幾種,event loop、using callback function。

database_query("select ...",  callback function); //應該這樣做

但是大部份的語言都不預設這種寫程式的方式,如果要達成這種功能,通常要花很大的心力,最後大部份程式員最多就做到多個執行緒,然用用一個執行緒去處理一個I/O Operation。

但Javascript是個特別的例外,因為這語言從第一天就一直在處理瀏覽器的Event Loop,callback function、anonymous function、Closure 是在平常也不過的方法了。Javascript的文化就是Event Programming。

Node.js 就是讓你單純只用Event、non-blocking的infrastructure來寫高度concurrent的程式。設計的目標是任何的function都不能直接存取I/O,一定要用callback的function來處理。其他特性還有專注在Low level、什麼都用串流、不強迫buffering、提供DNS/HTTP/TLS的內建支援。

HTTP包含: Chunked encoding, Pipelined message, hanging message.

Node的API要用client side JS Programmer熟悉的慣例,幾乎100% MIT/BSD Licensed。(唯一例外是openssl)

架構


Javascript               Node standard library
------------------------------------------------------------
                               Node binding
C                             -------------------------------------
                               V8   Thread pool & event pool

努力把使用者關在non-blocking的環境,用C語言當作屏障... XD


Node execution stack : only one stack

| load(index.html)    |
-------------------------
| http_parse(1)          |
-------------------------
| socket_readable(1) |
-------------------------
| ev_loop                  |
-------------------------
           | |
           V

| file_loaded()           |
-------------------------
| ev_loop                  |
-------------------------

然後是一大堆的小段程式範例。
包含web server和 file system的non-blocking I/O.
然後是2010年接下來的 Road Map。

沒有留言:

張貼留言