Node.js 

Hignly scalable web server
for web application

What is Node.js

Chome V8

Javascript

Javascript

V8

中間層 (libuv)

網卡

硬碟

​...

Why Node.js?

Event-Driven

Non-Blocking Programing

Non-Blocking Programing

AsyncAsynchronous I/O

Non-Blocking I/O

Asynchronous

AjAX

OS

非同步的應用廣泛,但在當時一般後端語言 EX: php 就不支援非同步的開發及多執行緒應用

Why AIO

// 耗費時間M
getData('from_db');

// 耗費時間N
getData('from_remote_api', function (result) {});

max(M, N, ...) vs M+N+...

Why Non-Blocking I/O

Node.js 本身是 Javascript

單執行緒遇到阻塞I/O

作業系統CPU與I/O之間可並行

多執行緒問題

Non-Blocking I/O

非阻塞 I/O 不需等資料讀完

為了達成 NIO

=> Polling (輪詢)

read

select

poll

epoll

kquene

Read

Select

poll

epoll

Node的非同步I/O

事件迴圈

觀察者

請求物件

事件迴圈

Subtitle

請求物件

fs.open = function (path, flags, mode, callback) {
  // ...
  binding.open(pathModule._makeLong(path),
               stringToFlags(flags),
               mode,
               callback);
}
// 請求物件
req_wrap->object_->Set(oncomplete_sym, callback);

// 放入執行緒池
QueneUserWorkItem();

// 完成後通知 AIO
PostQUenedCompletionStatus();

// 事件迴圈 I/O 觀察者獲取可用的請求物件
GetQueuedCompletionStatus();

整個非同步 I/O 流程

req_wrap->object_->Set(oncomplete_sym, callback);
QueneUserWorkItem();
PostQUenedCompletionStatus();
GetQueuedCompletionStatus();
Made with Slides.com