Node.js — это среда выполнения JavaScript, работающая на движке chrome V8 и libuv библиотеки C, которая обрабатывает операции ввода-вывода и асинхронные задачи. Node.js — это платформа, для понимания которой вы должны быть готовы понять причины, лежащие в основе ее философии.

Ядро узла

Наиболее заметной особенностью Node.js является его маленькое ядро, оно использует наименьший возможный набор функций, чтобы предоставить пользователям свободное пространство для творчества, подтверждая тот факт, что это не фреймворк. Причина, по которой Node так ценен для своих пользователей, заключается в том, что он вдохновляет нас делать больше. Каждый разработчик, который продолжает использовать Node.js, делает это потому, что влюблен в него. Люди изучают Node не из-за его популярности, а скорее потому, что он вдохновляет на творчество, давая возможность исследовать различные возможности для достижения цели. Node не является самоуверенной платформой.

Модули узла

Модули — это блоки для создания нетривиальных приложений в Node, и идея узловых модулей заключается в том, что они должны быть небольшими с точки зрения функциональности и размера кода. Это похоже на объединение набора тривиальных приложений для создания нетривиального. Небольшие модули упрощают понимание, тестирование и использование во внешних проектах. Поэтому нет ничего странного в том, что модули, которые делают похожие вещи, иногда сравнивают по размеру модулей. Node основывается на утверждении Леонардо да Винчи: «Простота — это высшая степень изощренности».

Удобный интерфейс

Эта идея поощряет разработку модулей, предоставляющих только определенный набор API или только один конкретный API. Это дает понять пользователю модуля, в чем заключается основная идея модуля, и сводит к минимуму ошибочное использование. Это способствует использованию модулей для простых и сложных целей, не сбивая пользователя с толку.

Модель реактора

Это ядро ​​асинхронности в Node.js.

Ввод/вывод такой медленный

Среди основных операций компьютера ввод-вывод — самый медленный. Доступ к оперативной памяти осуществляется довольно быстро, в основном за наносекунды, но проблема заключается в доступе к данным на диске или из сети, в основном это занимает миллисекунды, а, как мы знаем, повышенная задержка — не очень хорошая вещь в разработке программного обеспечения. Проблема с вводом-выводом не в ЦП, ввод-вывод в основном не требует больших ресурсов ЦП, но задержка между выполнением запроса и получением ответа является серьезной проблемой. Входные данные для программы иногда поступают от человека, поэтому скорость ввода-вывода в этой ситуации становится комбинацией технической скорости и скорости, с которой человек предоставляет данные, что может привести к невообразимому увеличению задержки.

Блокировка ввода/вывода

Традиционно при вводе-выводе, когда выполняется вызов функции для запроса, он блокирует выполнение потока до тех пор, пока запрос не будет выполнен. Если запрос был доступом к диску, вероятно, несколько миллисекунд или минут, но в случае, когда данные генерируются пользовательским вводом, затраченное время может стать крайне непредсказуемым. Нетрудно понять, что веб-сервер, полностью построенный на блокировке ввода-вывода, не сможет обрабатывать несколько запросов одновременно, и это будет очень неприятно с точки зрения взаимодействия с пользователем, поэтому обычное решение, как вы, вероятно, догадался, идет многопоточность. Проблема с этим подходом заключается в том, что он требует больших затрат памяти и других системных ресурсов, потому что потоки должны продолжать работать, даже когда они не используются, в дополнение к головной боли синхронизации нескольких потоков.

Неблокирующий ввод-вывод

Неблокирующий ввод-вывод предоставляется большинством операционных систем для выполнения запросов без блокировки выполнения потока. В неблокирующем вводе-выводе любой запрос возвращается немедленно. Он либо возвращает данные, либо предопределенную константу, когда данные еще недоступны. Это объясняется следующим псевдокодом:

Этот алгоритм является типом опроса, и он тратит много времени ЦП, поскольку большая часть времени тратится на опрос ресурсов, которые недоступны.

Демультиплексирование событий

Это механизм, предоставляемый современными операционными системами для эффективной обработки неблокирующего ввода-вывода. Он называется синхронным демультиплексором событий или интерфейсом уведомления о событиях. Чтобы понять работу этого алгоритма, взгляните на следующий псевдокод:

Ресурсы добавляются в список наблюдения, который представляет собой некоторую форму структуры данных. Затем вызывается демультиплексор событий как условие цикла while для наблюдения за ресурсами. Дело в том, что демультиплексор возвращает события только тогда, когда ресурсы доступны, поэтому он блокируется в цикле while, пока ресурсы не будут доступны. Как только какой-либо набор ресурсов становится доступным, он возвращает их, затем цикл обработки событий проходит через ресурсы, обращающиеся к ним в это время, больше не блокируется, поскольку они полностью доступны. Как только этот набор ресурсов обработан, цикл while возвращается к вызову демультиплексора и снова блокируется до тех пор, пока не станет доступным новый набор ресурсов.

Схема реактора

Шаблон реактора — это абстракция Node интерфейса уведомления о событии или синхронного демультиплексора событий. Демультиплексор событий Node реализован на C в библиотеке Libuv. И вот как это работает

  1. Делаются запросы, и ресурс, операция и обработчик отправляются в демультиплексор событий. Вызов демультиплексора событий является синхронным и немедленно возвращается.
  2. Демультиплексор событий наблюдает за ресурсами и, когда какой-либо ресурс становится доступным, помещает их в очередь событий и передает управление циклу обработки событий.
  3. Цикл событий перебирает события очереди событий.
  4. Для каждого события цикл передает управление приложению для выполнения обработчика, поскольку обработчики являются кодом приложения.
  5. (a) Во время выполнения могут быть сделаны некоторые другие запросы ввода-вывода, которые отправляют запросы на новый набор ресурсов в демультиплексор событий, который возвращается немедленно. (b) Управление передается обратно в цикл событий.
  6. Как только в очереди больше нет событий, управление передается обратно демультиплексору событий, который блокируется, и запускается новый цикл.

Асинхронное поведение Node заключается в том, что приложение пытается прочитать запрос, который может быть недоступен сразу, но предоставляет обработчик для выполнения, когда запрос доступен. Такое поведение стало возможным благодаря замыканиям JavaScript, в которых функция всегда будет выполняться. в том контексте, в котором оно было определено.

Поэтому шаблон реактора обрабатывает ввод-вывод, блокируя его до тех пор, пока не появятся новые события из набора наблюдаемых ресурсов, и реагирует, выполняя соответствующие обработчики для обработки каждого события.

На изображении ниже показано, как работает Node:

Я надеюсь, что эта статья помогла вам в вашем путешествии в Node.js, спасибо за чтение. Надеюсь, вы полюбите Node так же, как и я. Мир

использованная литература

Шаблоны проектирования Node.js от Casciaro, Mario

Приобрести можно на Мазоне