Як 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.

Потік виконання працює так:

  1. JavaScript виконує ваш код.
  2. libuv переносить важкі завдання у фоновий режим.
  3. JavaScript переходить до наступного рядка.
  4. libuv сповіщає Event Loop, коли завдання виконано.
  5. Event Loop запускає ваш callback.

Уявіть піцерію.

Без libuv ви стоїте біля стійки та кожні десять секунд питаєте: «Моя їжа готова?». Ви блокуєте чергу.

З libuv ви робите замовлення, сідаєте і чекаєте на сповіщення. Ви вільні робити інші справи, поки піца не буде готова.

Підсумок:

• Виконання JavaScript: 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