Как 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