Cách Node.js xử lý hàng ngàn yêu cầu
Người ta nói rằng Node.js là đơn luồng (single-threaded).
Tuy nhiên, nó có thể xử lý hàng ngàn yêu cầu, đọc tệp và thực hiện các lệnh gọi API mà không bị dừng lại.
Nó hoạt động như thế nào?
Câu trả lời chính là libuv.
libuv là một thư viện C. Nó cung cấp cho Node.js khả năng I/O bất đồng bộ (asynchronous) và không chặn (non-blocking). Bản thân JavaScript không thể tự đọc tệp hoặc quản lý các socket mạng. Node.js sử dụng libuv để giao tiếp với hệ điều hành của bạn.
Nếu không có libuv, JavaScript sẽ bị dừng lại mỗi khi bạn đọc một tệp. Ứng dụng của bạn sẽ trở nên không phản hồi.
Với libuv, việc đọc tệp diễn ra ở chế độ nền. JavaScript vẫn tiếp tục chạy các mã khác.
Ví dụ:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => {
console.log(data);
});
console.log("End");
Kết quả đầu ra: Start End (nội dung tệp)
Node.js in "End" trước khi tệp đọc xong. Nó không chờ đợi.
Cách libuv quản lý mã của bạn:
• The Event Loop: libuv chạy vòng lặp để kiểm tra xem các tác vụ đã hoàn thành hay chưa. Nó đưa các callback vào một hàng đợi khi các tác vụ hoàn tất. • Thread Pool: JavaScript sử dụng một luồng duy nhất. libuv sử dụng một nhóm các luồng công việc (worker threads). Theo mặc định, nhóm này có 4 luồng. Các luồng này xử lý các tác vụ nặng như:
- Các hoạt động hệ thống tệp
- Tra cứu DNS
- Nén dữ liệu
- Mã hóa
• Networking: libuv quản lý các socket HTTP, TCP và UDP. Điều này cho phép các máy chủ xử lý nhiều kết nối cùng một lúc.
• Timers: libuv xử lý
setTimeoutvàsetInterval.
Luồng thực thi hoạt động như sau:
- JavaScript chạy mã của bạn.
- libuv đưa các tác vụ nặng vào chế độ nền.
- JavaScript tiếp tục chạy dòng tiếp theo.
- libuv thông báo cho Event Loop khi tác vụ hoàn tất.
- Event Loop chạy callback của bạn.
Hãy tưởng tượng về một cửa hàng pizza.
Nếu không có libuv, bạn sẽ đứng tại quầy và hỏi "Đồ ăn của tôi xong chưa?" cứ mỗi mười giây một lần. Bạn làm tắc nghẽn hàng đợi.
Với libuv, bạn đặt hàng, ngồi xuống và đợi thông báo. Bạn có thể tự do làm những việc khác cho đến khi pizza sẵn sàng.
Summary:
• JavaScript execution: V8 Engine • Event Loop: libuv • File I/O: libuv • Network: libuv • Timers: libuv
libuv chính là động cơ giúp Node.js luôn nhanh chóng.
