Как 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 работает быстро.
