Javascript - один из моих любимых языков. Его легко изучить и начать с него. Итак, когда я узнал, что могу писать код на стороне сервера также на JS, должен признать, я был очень взволнован!

Итак, я начал писать все свои бэкэнд-проекты на Node JS, даже не задумываясь. После нескольких проектов я понял, что, хотя Node JS очень хорошо подходит для большинства моих проектов, для некоторых он не работает. После некоторого исследования я наконец нашел ответ на свой вопрос: «Когда именно мне следует использовать Node JS?».

Чтобы понять это, нам нужно увидеть, как работает Node!

Понимание того, как работает приложение Node.

Во-первых, Node JS - это не сервер. В том смысле, что Node JS ничего не обслуживает напрямую. Необходимо создать экземпляр сервера приложений с использованием других JS-библиотек. Следовательно, это в основном Javascript с дополнительными функциями для поддержки большинства основных потребностей серверной части, таких как доступ к файловой системе, системные вызовы ОС и т. Д. Волшебство происходит в движке JavaScript V8, который запускает программу узла.

Модель процесса

Node JS следует программированию на основе событий. Это абсолютное ядро ​​Node. Это однопоточная программа, которая выполняет обратные вызовы и никогда не блокирует основной поток.

Следовательно, вместо того, чтобы создавать новый поток для каждого нового пользователя, узел перебирает события всех пользователей в одном потоке. Это позволяет избежать накладных расходов на создание потока. Итак, в идеале основной поток слушает только события и ничего больше. Он никогда не блокируется из-за того, как узел заставляет вас писать код. Код, который вы пишете, всегда должен быть асинхронным и основываться на обратных вызовах.

Взгляните на схему ниже:

Событиями может быть любое действие, например HTTP-запрос или даже обратный вызов от любой операции ввода-вывода, которую ожидало приложение. Цикл событий обрабатывает каждое событие, которое появляется в очереди событий. Следовательно, всякий раз, когда происходит событие, оно обрабатывается и вызывается связанный обратный вызов. Вот почему мы слышим, как разработчики говорят: Node JS никогда не блокируется!

Теперь есть два типа приложений в зависимости от того, как они себя ведут.

  1. Интенсивная загрузка ЦП. Этим приложениям требуется большое количество циклов ЦП для своей работы. Например: тяжелые математические вычисления, обработка данных, обработка изображений и т. Д.
  2. Интенсивный ввод-вывод. Эти приложения в основном выполняют операции ввода-вывода. Например: доступ к базе данных, чтение и запись файлов, ответы на HTTP-запросы и так далее.

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

Хотя, в случае операций ввода-вывода, узел работает очень хорошо. Это связано с тем, что операции ввода-вывода в узле не выполняются в основном потоке. Большая часть операций ввода-вывода написана как неблокирующая асинхронная. Но некоторые фоновые операции ввода-вывода безумно сложно писать асинхронно. Для этих операций ввода-вывода API выполняются в отдельных потоках и процессах для доступа к БД и выполнения процесса. Также определенные файловые операции выполняются ОС. Внутренне Node JS полагается на libev для обеспечения цикла событий, который дополняется libeio, который использует объединенные потоки для обеспечения асинхронного ввода-вывода.

Таким образом, основной четный цикл фокусируется только на обработке событий, а не на связанных с ними операциях, что значительно сокращает время отклика.

Окончательный вердикт!

Из-за того, как работает NodeJS, мы можем сделать вывод, что:

  • Приложение с потенциально интенсивным вводом-выводом - лучшим выбором может быть Node JS ✔
  • Приложение, потенциально интенсивно использующее ЦП - Node JS будет работать очень медленно ✘
  • Выбирайте многопоточные системы, такие как Java.

Поскольку большинство веб-приложений не требуют интенсивной загрузки ЦП, Node по-прежнему выигрывает и это мое первое предпочтение !!!

Первоначально опубликовано на сайте atulr.com 5 ноября 2016 г.