1. Node.js Là gì? (Đừng nhầm lẫn!)
💡 Disclaimer: Node.js KHÔNG phải là một ngôn ngữ lập trình, và càng KHÔNG phải là một Framework.
Về bản chất (First Principles), Node.js là một Runtime Environment (Môi trường thực thi) cho JavaScript. Trước đây JS chỉ sống lay lắt trong trình duyệt (Browser), nhưng Node.js đã "giải phóng" nó để chạy trên Server, Laptop hay bất cứ đâu.
⚙️ Under-the-hood (Cấu tạo bên dưới)
Sức mạnh của Node.js đến từ sự kết hợp của 2 "gã khổng lồ":
- V8 JavaScript Engine: (Của Google Chrome) Đóng vai trò parse code JS và thực thi logic tính toán. Nó biên dịch JS thành Machine Code cực nhanh.
- Libuv: (Thư viện C++) Đây là "người hùng thầm lặng". Nó cung cấp cơ chế Event Loop và Thread Pool, giúp Node.js xử lý các tác vụ nặng (File System, Network, DNS) mà không bị "đơ".
2. Vũ khí tối thượng: "Non-blocking I/O" & Asynchronous
Đây là lý do khiến Node.js "out trình" so với các công nghệ cũ (như PHP, Java đời đầu) khi xử lý High Concurrency (lượng truy cập lớn).
☕ Ví dụ kinh điển: Mô hình Quán Cà Phê (Starbucks)
Để hiểu Event Loop, hãy tưởng tượng một quán cafe chỉ có duy nhất 1 nhân viên thu ngân (Single Thread).
⛔ Cách truyền thống (Blocking I/O - Chặn dòng chảy)
Giống như xếp hàng ở căn tin trường học cũ.
- Khách A order ly Latte -> Thu ngân dừng lại, tự tay đi pha -> Khách A nhận đồ -> Khách A đi.
- Mới đến lượt Khách B order. 👉 Hệ quả: Nếu pha ly Latte mất 5 phút, cả hàng người phía sau đứng "chôn chân". Server bị Block.
⚡ Cách của Node.js (Non-blocking I/O - Không chặn)
Phong cách Starbucks hiện đại.
- Khách A order -> Thu ngân đưa cái Buzzer (Callback) cho khách -> "Ra bàn ngồi đi em".
- Thu ngân quay sang nhận order của Khách B ngay lập tức.
- Trong bếp, các nhân viên pha chế (Worker Pool của Libuv) đang cật lực làm việc.
- Khi ly Latte xong -> Buzzer rung (Event trigger) -> Thu ngân gọi khách A lên lấy đồ.
👉 Hệ quả: Chỉ cần 1 thu ngân (1 Thread) nhưng xử lý được cả nghìn order, dòng người luôn di chuyển liên tục. Đó chính là sức mạnh của Event Loop.
3. Khi nào nên (và không nên) dùng Node.js?
✅ Good For: I/O Intensive
Node.js cực kỳ "bá" với các ứng dụng cần xử lý nhiều kết nối nhẹ nhưng liên tục:
- Real-time Chat (Socket.io).
- Streaming Services (Netflix cũng dùng Node.js).
- API Gateway / Proxy.
- Single Page Apps (SPA) server-side.
❌ Bad For: CPU Intensive
Vì Node.js là Single Threaded (đơn luồng) ở tầng JS, nếu bạn bắt nó tính toán nặng (như xử lý ảnh, encode video, thuật toán Matrix phức tạp), nó sẽ chiếm dụng luôn cái Thread duy nhất đó. 👉 Kết quả: Toàn bộ server bị "treo", không ai order được cafe nữa.
Lời khuyên: Với tác vụ nặng CPU, hãy dùng Worker Threads hoặc đẩy sang Golang/Rust/C++ để xử lý.