Что такое Node.js и чем он хорош — Журнал «Код»
Представьте:
- Вы написали простое приложение в браузере — например, анализатор текста или ипотечный калькулятор. Так как всё было в браузере, вы сразу написали всё на JavaScript. Софт работает, приносит пользу.
- Со временем вы развиваете проект. Появляются новые функции. Однажды появилась потребность в переносе программы на мощный сервер. Например, вы решили добавить к своему софту интеграцию с Телеграмом, а для этого нужен сервер.
- В обычной ситуации вам бы пришлось выбрать какой-нибудь серверный язык и написать свой софт заново — например, на Python или PHP. Но благодаря NodeJS можно скопипастить существующий код, переписав лишь ввод-вывод, и ваша программа продолжит покорять мир.
Запускаем телеграм-бота на сервере
Это и есть Node.js.
Что такое Node.js
Node.js — это система, которая исполняет JavaScript отдельно от вашего браузера. Можно сказать, что это самостоятельная среда для выполнения JavaScript.
Node.js можно установить на сервер (так же, как Python) и исполнять на нём ваш код, отдавая результат исполнения пользователям. На нём же можно делать отдельные приложения, используя дополнительные фреймворки.
Чем хорош Node.js
Если вы начинали изучать программирование, вам будет понятна концепция последовательного исполнения программы. Сначала исполняется первая строчка, потом вторая, потом третья и так далее. Может быть, где-то программа прыгнет вперёд-назад, где-то закольцуется, но в целом она исполняется линейно.
У JS есть фишка — он умеет исполнять код параллельно (условно говоря). Программисты называют это обработкой событий. Программе можно сказать: «Если когда-нибудь произойдёт вот это — выполните вон ту функцию, она знает, что делать». Таких событий можно предусмотреть много — получается, процессы как будто параллельны. Программа может просто сидеть и ждать, когда что-то произойдёт.
Больше того, процессы асинхронны: программа может что-то запросить в самом начале работы — например, спросить что-то у базы данных. И пока база данных чешется, программа на Node.js будет заниматься дальше своими делами. А как придёт ответ — возьмёт его и обработает.
При разработке любой программы на Node.js могут возникнуть сотни таких параллельных событий и обработчиков. Чтобы никто из них не перетягивал одеяло на себя, Node.js делает бесконечный цикл, в котором по кругу предоставляет процессорное время каждой функции. В результате создаётся иллюзия, что они работают параллельно и не мешают друг другу, но на самом деле ими жёстко управляет сама платформа.
Именно такое равномерное распределение всего в цикле событий и даёт Node.js преимущество при создании серверных приложений.
Пример: веб-сервер на Node.js
Как работает обычный веб-сервер
Раньше была такая проблема:
- На странице нужно, например, показать аватарку и никнейм пользователя.
- Для этого сервер делал запрос к базе данных, чтобы получить оттуда эту информацию.
- Пока база не ответит, сервер ничего не может сделать — он терпеливо ждёт.
- Сервер ждёт.
- Когда от базы приходит ответ с картинкой и никнеймом, сервер снова оживает, продолжает загружать страницу и в самом конце запрашивает у базы фоновую картинку для сайта.
- Сервер ждёт
- Страница тоже пока не работает, потому что не загрузилась до конца. Половина скриптов тоже не работают, потому что они ждут полной загрузки страницы. Все ждут, пока база ответит.
- На каждый такой запрос нужны ресурсы, чтобы держать соединение с базой.
- Если таких запросов много, ресурсы на сервере быстро заканчиваются, и тогда сайт начинает тормозить у всех сразу.
- Сервер начинает тупить и иногда вываливается с ошибкой. Страницы падают, пользователи психуют и уходят на другой сайт.
Как работает сервер на Node.js
- На странице нужно, например, показать аватарку и никнейм пользователя.
- Для этого сервер делает запрос к базе данных, чтобы получить оттуда эту информацию, а сам продолжает формировать страницу дальше.
- Пока не пришла аватарка, сервер уже сделал всё остальное и увидел, что нужна фоновая картинка.
- Сервер запрашивает картинку, а в это время ему пришла аватарка из прошлого запроса. Раз аватарка пришла, сервер вставляет её на нужное место. Пока он это делал — пришла фоновая картинка.
- Все материалы на месте, можно показывать страницу пользователю. Страница загружается быстрее, потому что сборка произошла параллельно.
Для чего ещё нужен Node.js
Кроме веб-приложений этот язык используют для создания любых сервисов, где нужен постоянный обмен информацией с пользователем:
- чаты,
- социальные сети,
- системы совместной работы над проектом,
- онлайн-редакторы текста.
А ещё на нём можно написать практически любое приложение и запустить его под Windows, MacOs или Linux. Это можно использовать для разработки универсальных приложений, например, списка задач, который должен работать на всех платформах, синхронизировать данные в реальном времени и уметь отправлять всё на мобильное устройство.
Последнее время большую популярность набирает использование Node.js для «интернета вещей» — умных чайников, весов и прочей бытовой техники. Здесь Node.js помогает управлять этими приборами и делать серверы, которые могут обрабатывать много запросов одновременно.
Кто это использует
Node.js в качестве основы для своей платформы выбрали много известных компаний:
- Walmart — крупнейшая сеть американских розничных магазинов,
- LinkedIn — социальная сеть деловых контактов,
- Uber — такси,
- E-bay — аукцион-платформа для продажи товаров по всему миру,
- GitHub — репозиторий проектов для программистов,
- Netflix — производство и съёмка сериалов,
- Trello — сервис для управлениями проектами.
С чего начать
Если хотите попробовать Node.js уже сейчас, начните с этих ресурсов — там достаточно информации для быстрого старта.
Медиум — очень кратко, но всё по делу.
RuVDS (.pdf) — отличное руководство по Node.
Node.js — это бэкенд
От бэкенда зависит многое: скорость загрузки страниц, надёжность сайтов и безопасность передачи данных. Хотите во всём этом разбираться и получить новую профессию — мы только за.
Начать карьеру в ИТ
Что это такое Node JS простыми словами — применение Node JS в программировании
«Что такое node js, где используется и для чего он нужен?», — самые часто задаваемые вопросы новичков, которые приходят в программирование, чтобы разрабатывать классные продукты с помощью популярного языка программирования Javascript. Но при чем здесь Node JS, почему он считается одной из самых популярных технологий в мире сегодня, в чем его плюсы и минусы и какие топовые мировые приложения были созданы, благодаря этой технологии? В этом материале мы ответим на все актуальные вопросы и расскажем все о Node JS.
Node.js — что это?
Node.js — это однопоточная кроссплатформенная среда выполнения с открытым исходным кодом и библиотека, которая используется для запуска веб-приложений, написанных на JavaScript, вне браузера клиента. Звучит немного сложно, правда?
Проще говоря, Node.js — это программная среда, которая позволяет запускать программы, написанные на языке Javascript, вне браузера. Исторически программы, написанные на Javascript, в отличие от других языков программирования, можно было запустить только в браузерах, которые имели специальный встроенный движок выполнения кода данного языка. Вне браузера Javascript, можно сказать, не работал.
При разработке Node.js за основу был взят движок выполнения JavaScript под названием V8, который был создан компанией Google и использовался в браузере Google Chrome. Так как после создания Node.js Javascript код можно запустить фактически в любой среде, с помощью этой библиотеки можно написать не только фронтенд, но и серверную часть веб-приложения.
Проще говоря, это означает, что целые сайты теперь могут работать с использованием единого «стека», что делает разработку и обслуживание гораздо более быстрой и легкой, позволяя сосредоточиться на достижении бизнес-целей проекта.
Node.js имеет открытый исходный код, поэтому работать с ним можно абсолютно бесплатно. Его и сегодня продолжает развивать и улучшать глобальное сообщество разработчиков.
Важно понимать, что Node.js на самом деле не фреймворк и не библиотека, как в случае с традиционным программным обеспечением, а среда выполнения. Он является легким, гибким и простым в развертывании, а все его функции помогут оптимизировать и ускорить ваше приложение.
Немного истории
Node.js был создан в 2009 году Райаном Далем. Даль критиковал ограничения, предлагаемые существующими на тот момент популярными веб-серверами. Ранее серверы с трудом обрабатывали большое количество одновременных соединений, а выполнение программы либо блокировало весь процесс, либо подразумевало необходимость использования процессора с несколькими ядрами. Все эти проблемы мешали компаниям создавать универсальные продукты, которые могли бы обслужить большое количество пользователей.
В ответ Даль создал Node. js, чтобы дать разработчикам возможность использовать язык JavaScript для разработки серверной части приложения, фактически унифицируя разработку веб-приложений вокруг единого языка программирования.
Первая версия Node.js поддерживала работу только с операционными системами Linux и Mac OS X. Ее разработкой и обслуживанием сначала руководил Даль, а позже ее спонсировала компания Joyent, занимающаяся программным обеспечением и сопутствующими услугами.
В январе 2010 года был представлен диспетчер пакетов для Node.js, который упрощает для программистов публикацию и совместное использование исходного кода пакетов Node.js, а также упрощает установку, удаление и обновление программы.
В 2011 году Microsoft и Joyent объединились для разработки собственной версии Node.js для Windows, расширив число поддерживаемых операционных систем и предоставив разработчикам гораздо больше возможностей.
Тогда был создан Node.js Foundation, который объединил разработчиков в единое сообщество. Node.js Foundation был объединен с JS Foundation в 2019 году, сформировав новый фонд OpenJS Foundation.
Характеристики
Node.js — одна из лучших технологий, которую может использовать разработчик. Помимо простоты в работе, он также очень быстро работает, отправляя ответ клиенту за считанные секунды.
Основные характеристики:1️⃣
Реализовано на JavaScriptNode.js написан на языке JavaScript. На сегодняшний день это самый популярный язык программирования в мире. Большинство программистов уже хорошо знакомы с JavaScript, его работой и другими базовыми и продвинутыми концепциями. Это делает Node.js простым для понимания и изучения. Кроме того, JavaScript также используется в стеке технологий для разработки клиентского интерфейса, а добавляя использование Node.js, разработчики могут создавать полноценные рабочие веб-проекты, зная только JavaScript.
2️⃣ Асинхронный характер
Важная особенность Node.js — асинхронный характер. Термин асинхронный означает, что сервер, созданный с использованием Node.js, не должен ждать, пока вернутся данные, при выполнении различных внутренних запросов. При этом он также имеет неблокирующий ввод-вывод. Это значит, что несколько различных процессов могут выполняться параллельно, не блокируя друг друга. Оба эти свойства делают Node.js крайне быстрым и обеспечивают лучший пользовательский интерфейс.
3️⃣ Архитектура, управляемая событиями
Термин «управляемый событиями» означает, что код перед выполнением ждет некоего события. В Node.js, при старте выполнения какой-либо операции, можно сразу же передать функцию, которая должна быть выполнена после окончания данной задачи. Такие функции называются функциями обратного вызова, также известны как обработчики события. Функции обратного вызова требуют меньше ресурсов на стороне сервера, а также занимают меньше памяти.
4️⃣ Однопоточная работа
В Node.js все запросы однопоточные и собираются в цикле обработки событий (Event loop). Это означает, что все программы выполняются в одном потоке, начиная с получения запроса и заканчивая выполнением требуемой задачи и отправкой ответа клиенту обратно. Эта функция Node.js предотвращает повторную загрузку запросов и сокращает время их обработки, что делает его более экономичным в использовании.
5️⃣ Совместимость с несколькими платформами
Как мы уже обсуждали ранее, Node.js можно использовать на разных системах, от Windows до Mac OS, Linux, и даже на мобильных платформах. Это позволяет создать самодостаточную среду в любой области разработки.
6️⃣ Быстрая потоковая передача данных
Node.js использует движок выполнения JavaScript V8. Этот движок также используется в браузере Google Chrome. Благодаря этому работа Node.js значительно ускоряется, а следовательно, обеспечивается очень быстрая потоковая передача данных для веб-приложения.
Зарплата Node.js-специалиста
По статистике сайта djinni, средняя зарплата Node. js-специалиста в Украине сегодня — $3000-$5000.
Сферы применения
Node.js используется для самых разных приложений. Ниже мы рассмотрим несколько популярных вариантов использования:
❇️ Чаты в реальном времени
Благодаря своей однопоточной асинхронной природе, Node.js можно использовать для обработки сообщений в реальном времени. Он легко масштабируется и часто используется при создании чат-ботов. Node.js также упрощает создание дополнительных функций чата, таких как многопользовательский чат и push-уведомления.
❇️ Интернет вещей (концепция IoT)
Приложения IoT обычно содержат несколько датчиков, поскольку они часто отправляют небольшие фрагменты данных, которые могут накапливаться при большом количестве запросов. Node.js в данном случае — хороший выбор, так как он может быстро обрабатывать эти одновременные запросы.
❇️ Потоковая передача данных
Такие компании, как Netflix, работают с Node. js для потоковой передачи. В основном это связано с тем, что Node.js легкий и быстрый. Кроме того, Node.js предоставляет собственный потоковый API. Эти потоки позволяют пользователям передавать друг другу данные быстрее, чем при использовании других технологий.
❇️ Сложные одностраничные приложения (SPA)
В SPA все приложение загружается один раз на одной HTML-странице. Обычно это означает, что в фоновом режиме выполняется несколько запросов для изменения компонентов на экране пользователя. Здесь на помощь приходит цикл обработки событий Node.js, поскольку он обрабатывает подобные запросы неблокирующим образом.
❇️ Приложения на основе REST API
JavaScript может использоваться как во внешнем, так и во внутреннем интерфейсе сайтов. Таким образом, сервер может легко взаимодействовать с внешним интерфейсом через REST API, используя Node.js. Node.js также предоставляет такие пакеты, как Express.js и Koa, которые позволяют создать веб-сервер с нуля еще проще и быстрее.
Заключение
Node.js является очень перспективной технологией, ведь ее используют многие известные компании, такие как Netflix, Uber, Paypal, LinkedIn и другие. Помимо громких имен, многие стартапы также используют Node.js при разработке своих приложений.
Главный вывод — обучение работе с Node.js сделает вас востребованным кандидатом на рынке IT. Если вы ищете курсы javascript с нуля или курс профессии разработчика Node.JS, то обратите внимания на образовательный центр DAN.IT. За время обучения вы овладеете всеми необходимыми технологиями, языками программирования, а также разработаете веб-интерфейсы и приложения. Курсы javaScript в DAN.IT— это отличный первый шаг навстречу востребованной IT-профессии.
Node.js Введение
❮ Предыдущий Далее ❯
Что такое Node.js?
- Node.js — это серверная среда с открытым исходным кодом
- Node.js бесплатен
- Node.js работает на различных платформах (Windows, Linux, Unix, Mac OS X и т. д.)
- Node.js использует JavaScript на сервере
Почему Node.js?
Node.js использует асинхронное программирование!
Обычной задачей веб-сервера может быть открытие файла на сервере и возврат содержимого в клиент.
Вот как PHP или ASP обрабатывают запрос файла:
- Отправляет задание в файловую систему компьютера.
- Ожидает, пока файловая система откроется и прочитает файл.
- Возвращает содержимое клиенту.
- Готов к обработке следующего
запрос.
Вот как Node.js обрабатывает запрос файла:
- Отправляет задачу в файловую систему компьютера.
- Готов к обработке следующего запроса.
- Когда файловая система открыл и прочитал файл, сервер возвращает содержимое клиенту.
Node.js устраняет ожидание и просто продолжает выполнение следующего запроса.
Node.js выполняет однопоточное, неблокирующее, асинхронное программирование, которое очень эффективно использует память.
Что может Node.js?
- Node.js может генерировать динамическое содержимое страницы
- Node.js может создавать, открывать, читать, записывать, удалять и закрывать файлы на сервере
- Node.js может собирать данные форм
- Node.js может добавлять, удалять и изменять данные в вашей базе данных
Что такое файл Node.js?
- Файлы Node.js содержат задачи, которые будут выполняться при определенных событиях
- Типичное событие — кто-то пытается получить доступ к порту на сервере
- Файлы Node.js должны быть инициированы на сервере, прежде чем они начнут действовать
- Файлы Node.js имеют расширение «.js»
❮ Предыдущий Следующий ❯
ВЫБОР ЦВЕТА
Лучшие учебники
Учебник по HTMLУчебник по CSS
Учебник по JavaScript
Учебник How To
Учебник по SQL
Учебник по Python
Учебник по W3.
Учебник по Bootstrap
Учебник по PHP
Учебник по Java
Учебник по C++
Учебник по jQuery
2 Top 3 Справочник по HTML
Справочник по CSS
Справочник по JavaScript
Справочник по SQL
Справочник по Python
Справочник по W3.CSS
Справочник по Bootstrap
Справочник по PHP
Цвета HTML
Справочник по Java
Справочник по Angular
Справочник по jQuery
Основные примеры
Примеры HTMLПримеры CSS
Примеры JavaScript
Примеры инструкций
Примеры SQL
Примеры Python
Примеры W3.CSS
Примеры Bootstrap
Примеры PHP
Примеры Java
Примеры jQuery
| О
W3Schools оптимизирован для обучения и обучения. Примеры могут быть упрощены для улучшения чтения и обучения. Учебники, ссылки и примеры постоянно пересматриваются, чтобы избежать ошибок, но мы не можем гарантировать полную правильность всего содержания. Используя W3Schools, вы соглашаетесь прочитать и принять наши условия использования, куки-файлы и политика конфиденциальности.
Copyright 1999-2023 Refsnes Data. Все права защищены.
W3Schools использует W3.CSS.
На кой черт мне использовать Node.js? Индивидуальное руководство
Примечание редактора. Английская версия этой статьи была обновлена нашей редакцией 03.10.2022. Он был изменен, чтобы включить последние источники и привести его в соответствие с нашими текущими редакционными стандартами.
Популярность JavaScript принесла с собой множество изменений. Всего несколько лет назад было трудно представить то, что мы делаем в Интернете сегодня.
Прежде чем мы углубимся в решения Node.js («Node»), учтите, что применение JavaScript в стеке для унификации языка и формата данных (JSON) будет способствовать оптимальному повторному использованию ресурсов разработчика. Поскольку это больше преимущество JavaScript, чем конкретно Node.
При всех своих преимуществах Node.js играет важную роль в стеке технологий многих известных компаний, которые зависят от его уникальных преимуществ. В этом руководстве по Node.js рассказывается, как реализовать эти преимущества и почему вы можете — или не можете — использовать Node.js.
Что такое Node.js?
Node.js состоит из движка Google V8 JavaScript, уровня абстракции платформы libUV и базовой библиотеки, написанной на JavaScript. Кроме того, Node.js основан на открытом веб-стеке (HTML, CSS и JS) и работает через стандартный порт 80.
Node.js предоставляет разработчикам комплексный инструмент для работы в неблокирующем, управляемом событиями Парадигма ввода-вывода. Райан Даль, создатель Node.js, был «вдохновлен такими приложениями, как Gmail», и при создании Node.js стремился создавать веб-сайты в реальном времени с возможностью push-уведомлений.
После более чем 20 лет работы в сети без сохранения состояния, основанной на парадигме запроса-ответа без сохранения состояния, у нас наконец-то появились веб-приложения с двусторонними соединениями в режиме реального времени.
Зачем использовать Node.js?
Node.js блестяще работает в веб-приложениях реального времени, использующих технологию push через WebSocket. После более чем 20 лет существования сети без сохранения состояния, основанной на парадигме запроса-ответа без сохранения состояния, у нас наконец-то появились веб-приложения с двусторонними соединениями в режиме реального времени, где и клиент, и сервер могут инициировать связь, что позволяет им более свободно обмениваться данными. Это резко контрастирует с типичной парадигмой веб-ответа, где клиент всегда инициирует общение.
Кто-то может возразить, что эта технология существует уже много лет в форме Flash и Java-апплетов. Однако на самом деле это были просто изолированные среды, которые использовали Интернет в качестве транспортного протокола для доставки клиенту. Кроме того, апплеты Flash и Java запускались изолированно и часто работали через нестандартные порты, что могло потребовать дополнительных разрешений.
Как работает Node.js?
Node отлично подходит для создания быстрых и масштабируемых сетевых приложений. Это связано с его способностью обрабатывать огромное количество одновременных соединений с высокой пропускной способностью.
Node.js использует неблокирующий ввод-вывод, управляемый событиями, чтобы оставаться легким и эффективным в условиях приложений реального времени, интенсивно использующих данные, которые выполняются на распределенных устройствах.
Node.js — это платформа, которая удовлетворяет определенные потребности, и понимание этого абсолютно необходимо. Например, вы не будете использовать Node.js для выполнения операций с интенсивным использованием ЦП. Почти все преимущества Node сводятся на нет, если он используется для тяжелых вычислений.
Node.js — это платформа, которая удовлетворяет определенные потребности. это , а не серебряная пуля или платформа, которая будет доминировать в мире веб-разработки.
Tweet
Интересно, как работает Node. js внутри. По сравнению с традиционными методами веб-обслуживания, когда каждое соединение (запрос) порождает новый поток (занимая системную оперативную память и в конечном итоге максимально используя доступный объем оперативной памяти), Node.js работает в одном потоке, используя неблокирующие вызовы ввода-вывода. Это позволяет Node поддерживать десятки тысяч одновременных подключений, удерживаемых в цикле событий.
Согласно статье Майкла Абернети 2011 года «Что такое Node.js?», возьмите поток с 2 МБ памяти, работающий в системе с 8 ГБ ОЗУ и обеспечивающий теоретически максимум 4 000 одновременных подключений. Добавьте к этому стоимость переключения контекста между потоками, и вы получите типичный сценарий для традиционных методов веб-обслуживания. Node.js позволяет избежать всего этого, достигая высокого уровня масштабируемости.
Конечно, возникает вопрос о совместном использовании одного потока всеми клиентскими запросами, что является потенциальной ловушкой при написании приложений Node. js.
Во-первых, тяжелые вычисления могут задушить единственный поток Node и вызвать проблемы для всех клиентов, поскольку входящие запросы блокируются до тех пор, пока указанные вычисления не будут завершены.
Во-вторых, разработчики должны быть бдительны и не допускать распространения исключений на основной (верхний) цикл обработки событий Node.js, так как это может привести к остановке экземпляра Node.js, что приведет к сбою программы.
Чтобы предотвратить поток исключений, мы передаем ошибки обратно вызывающему объекту в качестве параметров обратного вызова (вместо «выбрасывания», как мы делаем в некоторых других средах). Если возникает необработанное исключение, мы можем использовать модуль Forever или внешние инструменты, такие как upstart и monit, и просто upstart для мониторинга процесса Node.js и выполнения необходимого восстановления аварийного экземпляра. Обратите внимание, что эти инструменты не предназначены для восстановления текущего состояния сеанса пользователя.
npm: диспетчер пакетов Node
Встроенная поддержка управления пакетами с помощью npm включена в каждую установку Node.js. Идея модулей npm аналогична Ruby Gems: это набор общедоступных повторно используемых компонентов, которые легко устанавливаются через онлайн-репозиторий, с управлением версиями и зависимостями.
npm Inc. предоставляет список упакованных модулей, которые также доступны через инструмент командной строки npm. Экосистема модулей открыта для всех, кто может опубликовать свой собственный модуль, который будет добавлен в репозиторий npm.
Некоторые полезные модули npm включают:
express, Express.js или просто Express | Вдохновленная Синатрой среда веб-разработки для Node.js и де-факто стандарт для большинства Приложения Node.js. |
hapi | Модульная и простая в использовании ориентированная на конфигурацию структура для создания веб-приложений и сервисных приложений. |
connect | Расширяемая структура HTTP-сервера для Node.js, предоставляющая набор высокопроизводительных подключаемых модулей, известных как промежуточное ПО ; служит базовой основой для Express. |
socket.io и sockjs | Серверный компонент из двух общих компонентов WebSocket. |
pug (ранее Jade) | Механизм шаблонов, вдохновленный HAML, по умолчанию в Express.js. |
mongodb и mongojs | Оболочки MongoDB для предоставления API для объектных баз данных MongoDB в Node.js. |
redis | Клиентская библиотека Redis. |
lodash, underscore, lazy. js | Утилита JavaScript. Underscore инициировал игру, но был свергнут одним из двух своих аналогов, в основном из-за лучшей производительности lazy.js и модульной реализации. |
навсегда | Утилита для обеспечения непрерывной работы данного сценария узла; поддерживает ваш процесс Node.js в рабочем состоянии перед лицом любых непредвиденных сбоев. |
bluebird | Полнофункциональная реализация Promises/A+ с исключительно хорошей производительностью. |
moment.js | Библиотека дат JavaScript для разбора, проверки, обработки и форматирования дат. |
Где использовать Node.js
Чат
Чат — это типичное многопользовательское приложение реального времени — от IRC (было раньше) — до современных реализаций в Node. js с WebSocket.
Приложение чата легкое, с большим объемом трафика и данных (но с низкой обработкой
Простой, но охватывающий большинство парадигм, которые вы когда-либо будете использовать в типичном приложении Node.js, чат — отличный пример использования для обучения.
Давайте представим, как работает чат. Допустим, у нас есть единая комната чата, где пользователи могут обмениваться сообщениями по принципу «один ко многим» (фактически всем). Предположим также, что к нашей доске объявлений подключены три пользователя.
На стороне сервера простое приложение Express.js реализует:
- Обработчик запросов
GET /
, который обслуживает веб-страницу, содержащую доску объявлений и кнопку «Отправить» для инициализации ввода нового сообщения, и - Сервер WebSocket, который прослушивает новые сообщения, отправляемые клиентами WebSocket.
На стороне клиента у нас есть HTML-страница с несколькими настроенными обработчиками:
- Обработчик события нажатия кнопки «Отправить», который принимает входное сообщение и отправляет его по WebSocket.
- Обработчик, который прослушивает новые входящие сообщения на клиенте WebSocket (т. е. пользовательские сообщения, которые сервер хочет отобразить на клиенте).
Когда клиент отправляет сообщение, происходит следующее:
- Браузер перехватывает нажатие кнопки «Отправить» через обработчик JavaScript. Он берет значение из поля ввода (т. е. текст сообщения) и отправляет сообщение WebSocket, используя клиент WebSocket, подключенный к нашему серверу (инициализируется при инициализации веб-страницы).
- Серверный компонент соединения WebSocket получает сообщение и пересылает его всем другим подключенным клиентам, используя широковещательный метод.
- Все клиенты получают новое сообщение в виде push-сообщения через клиентский компонент WebSocket, работающий на веб-странице. Затем клиенты получают содержимое сообщения и обновляют веб-страницу на месте, добавляя новое сообщение на доску.
Вот простой пример чата в реальном времени с NodeJS, Socket.io и ExpressJS.
Для более мощного решения вы можете использовать простой кеш на основе хранилища Redis. Или, в еще более сложном решении, используйте очередь сообщений для маршрутизации сообщений клиентам и более надежный механизм доставки. Очередь может покрывать временные потери соединения или хранить сообщения для зарегистрированных клиентов, пока они не в сети.
Независимо от того, какое решение вы выберете, Node.js работает по одним и тем же основным принципам: реагирование на события, обработка множества одновременных подключений и поддержание гибкости взаимодействия с пользователем.
API поверх объектной базы данных
Node.js идеально подходит для предоставления данных из объектных баз данных (например, MongoDB). Данные, хранящиеся в формате JSON, позволяют Node. js работать без несоответствия импеданса и преобразования данных.
Например, если вы используете Rails, вы должны преобразовать JSON в двоичные модели, а затем предоставить их обратно как JSON через HTTP, когда данные потребляются Backbone.js, Angular.js и т. д., или даже просто jQuery AJAX вызывает. С помощью Node.js вы можете предоставлять объекты JSON с помощью REST API для использования клиентом.
Если вы используете MongoDB, вам не нужно беспокоиться о преобразовании между JSON и чем-либо еще при чтении или записи из базы данных. Таким образом, вы можете избежать необходимости многократного преобразования, используя единый формат сериализации данных для клиента, сервера и базы данных.
Заданные в очередь входные данные
Узел позволяет гибко отодвигать списания базы данных в сторону. Но есть еще больше причин использовать Node.js.
Если вы одновременно получаете большой объем данных, ваша база данных может стать узким местом. Node.js может легко обрабатывать одновременные соединения. Поскольку в данном случае доступ к базе данных является блокирующей операцией, у нас возникают проблемы. Решение состоит в том, чтобы подтвердить поведение клиента до того, как данные будут действительно записаны в базу данных.
Такой подход позволяет системе поддерживать быстродействие при большой нагрузке. Это особенно полезно, когда клиенту не требуется твердое подтверждение успешной записи данных, при регистрации или записи данных отслеживания пользователей, обрабатываемых пакетами, для использования в более позднее время или для операций, которые не нужно выполнять. отражается мгновенно, как обновление счетчика «лайков» в Facebook.
Данные поставлены в очередь через какую-либо инфраструктуру кэширования или очередей сообщений, такую как RabbitMQ или ZeroMQ. Затем он обрабатывается отдельным процессом пакетной записи базы данных или серверной службой обработки с интенсивными вычислениями, написанной на более производительной платформе для такой задачи.
Вкратце: с помощью Node вы можете отодвинуть записи в базу данных на потом.
Потоковая передача данных
Почему бы не использовать Node.js для потоковой передачи данных? На более традиционных веб-платформах HTTP-запросы и ответы обрабатываются как изолированные события, хотя на самом деле они представляют собой потоки. Мы можем использовать это наблюдение для создания некоторых интересных функций Node.js.
Например, мы можем обрабатывать файлы, пока они еще загружаются. Поскольку данные поступают через поток, мы можем обрабатывать их параллельно в процессе загрузки. Это верно для кодирования аудио или видео в реальном времени и проксирования между различными источниками данных.
Прокси-сервер
Node.js легко использовать в качестве прокси-сервера на стороне сервера, где он может обрабатывать большое количество одновременных подключений неблокирующим образом. Это полезно для проксирования различных сервисов с разным временем отклика или сбора данных из нескольких источников.
В качестве примера рассмотрим серверное приложение, которое взаимодействует со сторонними ресурсами, извлекает данные из разных источников или сохраняет активы (например, изображения и видео) в сторонних облачных службах.
Использование Node вместо выделенного прокси-сервера может оказаться полезным, если ваша инфраструктура прокси-сервера отсутствует или вам нужно решение для локальной разработки. Под этим я подразумеваю, что вы можете создать клиентское приложение с сервером разработки Node.js для ресурсов и проксирования/заглушки запросов API. В продакшне вы будете обрабатывать такие взаимодействия с помощью выделенной прокси-службы (например, nginx или HAProxy).
Информационная панель брокера/биржевого трейдера
На уровне приложений торговое программное обеспечение брокеров является еще одним примером, где доминирует настольное программное обеспечение, но его можно легко заменить веб-решением, работающим в режиме реального времени. Торговое программное обеспечение брокеров отслеживает цены на акции, выполняет расчеты и технический анализ, а также отображает графики и диаграммы.
Почему бы не использовать Node.js для написания веб-решения для брокеров в режиме реального времени? Затем брокеры могли легко переключаться между рабочими станциями или рабочими местами. Возможно, вскоре мы встретимся с нашими брокерами на пляжах Флориды, Ибицы или Бали.
Информационная панель мониторинга приложений
Представьте, как вы могли бы развивать свой бизнес, если бы могли видеть, что делают ваши посетители в режиме реального времени. Благодаря двусторонним сокетам Node в реальном времени вы можете получить эту возможность.
Node с WebSocket идеально подходит для отслеживания посетителей веб-сайта и визуализации их взаимодействия в режиме реального времени.
Причины использования Node.js для панели мониторинга включают в себя сбор статистики от пользователей в реальном времени или введение целевых взаимодействий с вашими посетителями путем открытия канала связи в определенной точке вашей воронки. CANDDi реализует эту идею.
Панель мониторинга системы
Теперь давайте рассмотрим инфраструктуру. Представьте, например, поставщика SaaS, который хочет предложить пользователям страницу мониторинга службы, такую как страница состояния GitHub. С помощью цикла событий Node.js мы можем создать мощную веб-панель управления, которая асинхронно проверяет статусы сервисов, отправляя данные клиентам с помощью WebSocket.
С помощью этой технологии можно сообщать о состоянии как внутренних (внутрикорпоративных), так и государственных услуг в режиме реального времени. Продвиньтесь немного дальше и попытайтесь представить себе центр управления сетью (NOC), который отслеживает приложения оператора связи, облачного/сетевого/хостинг-провайдера или какого-либо финансового учреждения. Приложения будут работать в открытом веб-стеке, поддерживаемом Node.js и WebSocket.
Не пытайтесь создавать системы жесткого реального времени в Node (т. е. системы, требующие постоянного времени отклика). Erlang, вероятно, лучший выбор для этого класса приложений.
Где использовать Node.js, но с осторожностью
Веб-приложения на стороне сервера
Используя Node.js с Express.js, вы можете создавать классические веб-приложения на стороне сервера. Хотя это возможно, эта парадигма запроса-ответа, в которой Node.js будет нести отображаемый HTML, не является идеальным вариантом использования. Приводятся аргументы за и против такого подхода. Вот несколько фактов, которые следует принять во внимание:
Плюсы:
- Вы можете значительно упростить разработку приложения, не требующего ресурсоемких вычислений, используя Javascript для построения его сверху донизу, вплоть до уровня базы данных — если вы используете объектную базу данных хранилища JSON (например, MongoDB).
- Сканеры получают полностью отрендеренный HTML-ответ, который гораздо более удобен для SEO, чем, скажем, одностраничное приложение или приложение WebSocket, работающее поверх Node.js.
Минусы:
- Любые вычисления с интенсивным использованием ЦП будут блокировать отзывчивость Node.js, поэтому многопоточная платформа является лучшим подходом. В качестве альтернативы вы можете попробовать масштабировать вычисления.
- Использование Node. js с реляционной базой данных может быть болезненным. Если вы пытаетесь выполнять реляционные операции, рассмотрите возможность использования такой среды, как Rails, Django или ASP.Net MVC.
Альтернативой вычислениям, интенсивно использующим ЦП, является создание высокомасштабируемой среды на основе MQ с внутренней обработкой, чтобы Node оставался фронтальным «клерком» для асинхронной обработки клиентских запросов.
Где не следует использовать Node.js
Бывают ситуации, когда Node может оказаться не лучшим инструментом для работы.
Серверное веб-приложение с приложением реляционной базы данных
Когда-то Ruby on Rails был очевидным выбором в качестве инструмента для доступа к реляционным базам данных, таким как PostgreSQL, MySQL и Microsoft SQL Server. Это было связано с тем, что инструменты реляционной БД для Node.js все еще находились на ранних стадиях, в то время как Rails, напротив, автоматически предоставляла настройку доступа к данным прямо из коробки вместе с инструментами поддержки миграции схемы БД и другими драгоценными камнями (каламбур). Rails и аналогичные фреймворки имеют зрелые и проверенные реализации уровня доступа к данным Active Record или Data Mapper.
Вполне возможно и нередко использовать Node исключительно во внешнем интерфейсе, сохраняя при этом серверную часть Rails с ее легким доступом к реляционной БД.
Но все изменилось. Sequelize, TypeORM и Bookshelf прошли долгий путь, чтобы стать зрелыми решениями ORM. Возможно, вам также стоит проверить Join Monster, если вы хотите генерировать SQL из запросов GraphQL.
Тяжелые вычисления и/или обработка на стороне сервера
Node.js — не лучшая платформа для выполнения тяжелых вычислений. Нет, вы определенно не хотите создавать сервер вычислений Фибоначчи в Node.js.
Как правило, любая операция с интенсивным использованием ЦП сводит на нет все преимущества пропускной способности, которые предлагает Node с его управляемой событиями неблокирующей моделью ввода-вывода. Это связано с тем, что входящие запросы блокируются, пока поток занят вашей обработкой чисел — при условии, что вы пытаетесь запустить вычисления в том же экземпляре Node, который используется для ответа на запросы.
Поскольку Node.js является однопоточным и использует только одно ядро ЦП, разработка кластерного модуля для обеспечения параллелизма на многоядерном сервере потребует значительных усилий. Кроме того, вы можете довольно легко запустить несколько экземпляров сервера Node.js за обратным прокси через nginx.
При использовании кластеризации все тяжелые вычисления все же следует переложить на фоновые процессы. Убедитесь, что вы используете подходящую среду для фоновых процессов и что они взаимодействуют через сервер очереди сообщений, такой как RabbitMQ.
Хотя вы можете запускать фоновые процессы на главном сервере, этот подход может плохо масштабироваться при увеличении нагрузки. Вы можете распределить службы фоновой обработки на отдельные рабочие серверы без необходимости настраивать нагрузку на внешние веб-серверы.
С Node.js — в отличие от большинства других платформ — вы получаете высокую пропускную способность запросов в секунду, о которой мы говорили, поскольку каждый запрос — это небольшая задача, которую Node выполняет быстро и эффективно.
Почему стоит выбрать Node.js?
Мы обсудили Node.js от теории к практике, начиная с его цели и заканчивая его преимуществами и ловушками.
Проблемы с Node почти всегда возникают из-за того, что операции блокировки являются корнем всех зол, а 99% злоупотреблений Node являются их прямым следствием.
В Node блокирующие операции являются корнем всех зол — 99% неправильного использования Node являются прямым следствием.
Tweet
Если ваш вариант использования не содержит операций, интенсивно использующих ЦП, и не требует доступа к блокирующим ресурсам, вы можете использовать преимущества Node.js и пользоваться быстрыми и масштабируемыми сетевыми приложениями. Добро пожаловать в сеть реального времени.
Понимание основ
Что такое Node.js?
Node.js — это серверная среда выполнения JavaScript с открытым исходным кодом. Node использует движок Google V8 — libUV — для обеспечения кроссплатформенной совместимости и базовой библиотеки. Примечательно, что Node.js не предоставляет объект глобального окна, поскольку он не запускается в браузере.
Для чего используется Node.js?
Поскольку Node.js является однопоточным, мы используем его в основном для неблокирующих серверов, управляемых событиями. Мы также можем использовать Node.js для традиционных веб-сайтов и серверных API-сервисов, поскольку он был разработан с учетом архитектуры, основанной на push-уведомлениях в реальном времени.
Что такое веб-фреймворк?
Веб-фреймворки, такие как Angular и React, представляют собой библиотеки, которые помогают организовывать и генерировать интерфейсный код, который запускается в веб-браузере. Веб-фреймворки повторно используют код для общих операций, тем самым сокращая время разработки. Некоторые веб-фреймворки представляют собой полный стек.
Является ли Node.js фреймворком?
Нет, Node.js — это среда. Серверные фреймворки работают в Node.js. Популярные совместимые платформы включают Express.