Серверная среда выполнения Node.js
Node.js - это серверная среда с открытым исходным кодом. Node.js позволяет выполнять JavaScript на сервере.
Являясь асинхронной событийно-ориентированной средой выполнения JavaScript, Node.js предназначен для создания масштабируемых сетевых приложений. В следующем примере hello world
можно одновременно обрабатывать множество соединений. При каждом подключении выполняется обратный вызов, но если работа не выполняется, Node.js засыпает.
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Это отличается от более распространенной сегодня модели параллелизма, в которой используются потоки ОС. Сеть на основе потоков относительно неэффективна и очень сложна в использовании. Кроме того, пользователи Node.js могут не беспокоиться о мертвой блокировке процесса, поскольку в нем нет блокировок. Почти ни одна функция в Node.js не выполняет ввод/вывод напрямую, поэтому процесс никогда не блокируется, за исключением тех случаев, когда ввод/вывод выполняется с помощью синхронных методов стандартной библиотеки Node.js. Поскольку ничто не блокируется, масштабируемые системы очень разумно разрабатывать на Node.js.
Если некоторые из этих формулировок вам незнакомы, есть полная статья Блокирование против неблокирования.
Node.js похож по дизайну на такие системы, как Ruby's Event Machine и Python's Twisted, и испытал их влияние. Node.js продвигает событийную модель немного дальше. Он представляет цикл событий как конструкцию времени выполнения, а не как библиотеку. В других системах всегда есть блокирующий вызов для запуска цикла событий. Обычно поведение определяется через обратные вызовы в начале сценария, а в конце запускается сервер через блокирующий вызов типа EventMachine::run()
. В Node.js нет такого вызова start-the-event-loop
. Node.js просто входит в цикл событий после выполнения входного сценария. Node.js выходит из цикла событий, когда больше нет обратных вызовов для выполнения. Это поведение похоже на браузерный JavaScript - цикл событий скрыт от пользователя.
HTTP - это первоклассный гражданин в Node.js, разработанный с учетом потоковой передачи и низкой задержки. Это делает Node.js хорошо подходящим для основы веб-библиотеки или фреймворка.
То, что Node.js разработан без потоков, не означает, что вы не можете использовать преимущества нескольких ядер в вашей среде. Дочерние процессы могут быть порождены с помощью нашего API child_process.fork()
, и с ними легко взаимодействовать. На этом же интерфейсе построен модуль кластера, который позволяет разделять сокеты между процессами для балансировки нагрузки на ядра.