วิธีที่ Node.js จัดการกับคำขอ (Requests) นับพันรายการ
หลายคนบอกว่า Node.js ทำงานแบบ single-threaded
แต่ถึงอย่างนั้น มันกลับสามารถจัดการกับคำขอนับพันรายการ, อ่านไฟล์ และเรียกใช้งาน API ได้โดยไม่หยุดชะงัก
มันทำงานได้อย่างไร?
คำตอบคือ libuv
libuv คือไลบรารีภาษา C ซึ่งช่วยให้ Node.js มีความสามารถในการทำ I/O แบบ asynchronous และ non-blocking เนื่องจาก JavaScript ไม่สามารถอ่านไฟล์หรือจัดการ network sockets ได้ด้วยตัวเอง Node.js จึงใช้ libuv ในการสื่อสารกับระบบปฏิบัติการ (OS) ของคุณ
หากไม่มี libuv JavaScript จะต้องหยุดทำงานทุกครั้งที่คุณอ่านไฟล์ ซึ่งจะทำให้แอปพลิเคชันของคุณไม่ตอบสนอง
แต่เมื่อมี libuv การอ่านไฟล์จะเกิดขึ้นในพื้นหลัง (background) ในขณะที่ JavaScript ยังคงทำงานส่วนอื่นต่อไปได้
ตัวอย่าง:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => {
console.log(data);
});
console.log("End");
ผลลัพธ์: Start End (เนื้อหาในไฟล์)
Node.js พิมพ์ "End" ออกมาก่อนที่การอ่านไฟล์จะเสร็จสิ้น เพราะมันไม่รอ
วิธีที่ libuv จัดการโค้ดของคุณ:
• The Event Loop: libuv จะรัน loop เพื่อตรวจสอบว่างานต่าง ๆ เสร็จสิ้นหรือยัง และจะนำ callback ไปใส่ไว้ในคิวเมื่อทำงานเสร็จ • Thread Pool: JavaScript ใช้เพียงเธรดเดียว แต่ libuv ใช้กลุ่มของ worker threads โดยค่าเริ่มต้น pool นี้จะมี 4 threads ซึ่ง threads เหล่านี้จะจัดการกับงานหนัก ๆ เช่น:
- การทำงานกับระบบไฟล์ (File system operations)
- การค้นหา DNS (DNS lookups)
- การบีบอัดข้อมูล (Compression)
- การเข้ารหัส (Cryptography) • Networking: libuv จัดการ HTTP, TCP และ UDP sockets ซึ่งช่วยให้เซิร์ฟเวอร์สามารถรองรับการเชื่อมต่อจำนวนมากได้พร้อมกัน • Timers: libuv จัดการ setTimeout และ setInterval
ลำดับการทำงาน (Execution flow) เป็นดังนี้:
- JavaScript รันโค้ดของคุณ
- libuv นำงานหนัก ๆ ไปทำในพื้นหลัง
- JavaScript ทำงานต่อไปยังบรรทัดถัดไป
- libuv แจ้งไปยัง Event Loop เมื่อทำงานเสร็จสิ้น
- Event Loop รัน callback ของคุณ
ลองนึกถึงร้านพิซซ่า
หากไม่มี libuv คุณจะต้องยืนอยู่ที่เคาน์เตอร์แล้วถามว่า "อาหารของฉันเสร็จหรือยัง?" ทุก ๆ 10 วินาที ซึ่งเป็นการขวางแถวลูกค้าคนอื่น
แต่เมื่อมี libuv คุณสั่งอาหาร นั่งลง และรอการแจ้งเตือน คุณสามารถไปทำอย่างอื่นได้จนกว่าพิซซ่าจะเสร็จ
สรุป:
• JavaScript execution: V8 Engine • Event Loop: libuv • File I/O: libuv • Network: libuv • Timers: libuv
libuv คือเครื่องยนต์ที่ทำให้ Node.js ทำงานได้อย่างรวดเร็ว
แหล่งที่มา: https://dev.to/kavindotdev/understanding-libuv-the-engine-behind-nodejs-asynchronous-programming-3n7o
