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();
deck
By Stanney Yen
deck
- 266