Ban biên tập CodeReady
Kien thuc chuyen sau Node.js cho Backend Developer: Kien truc, Event Loop va Best Practices
Tim hieu ve kien truc bat dong bo, Event Loop, xu ly loi nang suat cao va cac best practices khi xay dung ung dung Backend voi Node.js.
Node.js da tro thanh mot trong nhung cong nghe nen tang phien ma nguon mo pho bien nhat cho viec xay dung cac ung dung backend hieu nang cao, thoi gian thuc va kha nang mo rong tot. Bai viet nay se di sau vao ban chat ky thuat cua Node.js, giup cac ky su backend hieu dung cach van hanh cua he thong.
1. Kien truc va Event Loop trong Node.js
Hieu ve Event Loop la dieu kien tien quyet de viet code Node.js hieu qua, tranh hien tuong block main thread.
Vong doi cua Event Loop
Node.js chay tren mot luong don (single-threaded) cho JavaScript logic, nhung ho tro da luong thong qua thu vien libuv cho cac Tac vu I/O. Event Loop gom nhieu giai đoạn (phase) chinh:
- Timers: Xu ly cac callback tu setTimeout() va setInterval().
- Pending callbacks: Xu ly cac I/O callback con sot lai tu chu ky truoc.
- Poll: Tim kiem cac su kien I/O moi; thuc thi cac I/O callback.
- Check: Thuc thi cac callback tu setImmediate().
- Close callbacks: Xu ly cac su kien nhu socket.on('close', ...).
const fs = require('fs');
console.log('1. Bat dau');
setTimeout(() => {
console.log('2. Timer callback');
}, 0);
setImmediate(() => {
console.log('3. Immediate callback');
});
fs.readFile(__filename, () => {
console.log('4. I/O callback');
});
console.log('5. Ket thuc');2. Cac loi thuong gap va Cach xu ly
Khi lam viec voi Node.js o quy mô lon, cac lap trinh vien thuong gap mot so van de ve hieu nang va on dinh.
Block Event Loop voi Tac vu Nang
Vi JavaScript chay don luong, bat ky thao tac xu ly CPU nang (nhu ma hoa mat khau, xu ly anh, tinh toan toan hoc phuc tap) tren luong chinh se lam dung he thong, khien tat ca cac request khac phai cho doi.
Giai phap: Su dung Worker Threads hoac tach cac tac vu nay sang microservice rieng biet.
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
if (isMainThread) {
module.exports = function runService(workerData) {
return new Promise((resolve, reject) => {
const worker = new Worker(__filename, { workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0)
reject(new Error(`Worker stopped with exit code ${code}`));
});
});
};
} else {
const result = workerData * 2; // Xu ly nang o day
parentPort.postMessage(result);
}3. Best Practices cho Backend Node.js
- Quan ly bat dong bo: Luon su dung async/await thay cho callback hell, va dam bao bat loi day du voi try/catch hoac unhandledRejection handler.
- Quan ly Bo nho (Memory Management): Tránh ro ri bo nho (memory leak) do closures, global variables hoac event listeners khong duoc go bo.
- Structured Logging: Su dung cac thu vien nhu Pino hoac Winston de ghi log duoi dang JSON, thuan loi cho viec giam sat va phan tich log.
- Graceful Shutdown: Xu ly tin hieu SIGTERM va SIGINT de dong ket noi database va hoan tat cac request dang xu ly truoc khi tien trinh tat han.
4. FAQ: Cau hoi thuong gap trong phong van
Tai sao Node.js nhanh voi cac tac vu I/O bound nhung lai cham voi CPU bound?
Node.js su dung mo hinh khong dong bo, huong su kien (event-driven, non-blocking I/O) thong qua libuv giup xu ly dong thoi hang ngan ket noi ma khong can tao mot luong moi cho moi request. Tuy nhien, neu gap tac vu xu ly CPU nang, main thread se bi chiem dung va khong the phuc vu cac request khac.
Lam the nao de scale ung dung Node.js tren may nhieu nhan CPU?
Su dung module Cluster co san trong Node.js hoac cac cong cu nhu PM2 de chay nhieu tien trinh (process) phan bo tren tat ca cac nhan CPU cua may chu.