Як Node.js обробляє тисячі запитів
Кажуть, що Node.js є однопотоковим.
Проте він обробляє тисячі запитів, читає файли та робить виклики API без зупинок.
Як це працює?
Відповідь — libuv.
libuv — це бібліотека на C. Вона надає Node.js можливості асинхронного та неблокуючого введення-виведення (I/O). JavaScript не може самостійно читати файли або керувати мережевими сокетами. Node.js використовує libuv для взаємодії з вашою операційною системою.
Без libuv JavaScript зупинявся б щоразу, коли ви читаєте файл. Ваш додаток став би нечутливим до запитів.
З libuv читання файлу відбувається у фоновому режимі. JavaScript продовжує виконувати інший код.
Приклад:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => {
console.log(data);
});
console.log("End");
Результат: Start End (вміст файлу)
Node.js виводить "End" ще до того, як файл закінчить читання. Він не чекає.
Як libuv керує вашим кодом:
• Event Loop: libuv запускає цикл, який перевіряє, чи завершені завдання. Коли завдання виконуються, він додає callback-функції в чергу. • Thread Pool: JavaScript використовує один потік. libuv використовує пул робочих потоків. За замовчуванням цей пул має 4 потоки. Ці потоки обробляють важкі завдання, такі як:
- Операції з файловою системою
- DNS-запити
- Стиснення
- Криптографія • Networking: libuv керує сокетами HTTP, TCP та UDP. Це дозволяє серверам обробляти багато з'єднань одночасно. • Timers: libuv обробляє setTimeout та setInterval.
Потік виконання працює так:
- JavaScript виконує ваш код.
- libuv переносить важкі завдання у фоновий режим.
- JavaScript переходить до наступного рядка.
- libuv сповіщає Event Loop, коли завдання виконано.
- Event Loop запускає ваш callback.
Уявіть піцерію.
Без libuv ви стоїте біля стійки та кожні десять секунд питаєте: «Моя їжа готова?». Ви блокуєте чергу.
З libuv ви робите замовлення, сідаєте і чекаєте на сповіщення. Ви вільні робити інші справи, поки піца не буде готова.
Підсумок:
• Виконання JavaScript: V8 Engine • Event Loop: libuv • File I/O: libuv • Network: libuv • Timers: libuv
libuv — це двигун, який робить Node.js швидким.
