int(1)

Node.js: что это такое и для чего он нужен? Часть 2.

Turing Bootcamp 08.08.2021 0

Перед тем, как прочитать вторую часть, ознакомьтесь с первой частью статьи.

Примеры использования Node.js

ЧАТ
Чат — наиболее типичное многопользовательское приложение, работающее в реальном времени. От IRC (в те времена) через множество проприетарных и открытых протоколов, работающих на нестандартных портах, до возможности реализовать все сегодня в Node.js с веб-сокетами, работающими через стандартный порт 80.
Приложение чата — действительно лучший пример для Node.js: это легкое приложение с большим объемом трафика и большими объемами данных (но с низким уровнем обработки / вычислений), которое работает на распределенных устройствах. Это также отличный вариант использования для обучения, поскольку он прост, но он охватывает большинство парадигм, которые вы когда-либо будете использовать в типичном приложении Node.js.
Попробуем изобразить, как это работает.

В простейшем примере у нас есть единый чат на нашем веб-сайте, куда люди приходят и могут обмениваться сообщениями в режиме «один ко многим» (фактически всем). Например, предположим, что у нас есть три человека на веб-сайте, все подключенные к нашей доске сообщений.

На стороне сервера у нас есть простое приложение Express.js, которое реализует две вещи:

— GET /Обработчик запросов , который обслуживает веб — страницу , содержащую как доску объявлений и кнопку «Отправить» , чтобы инициализировать новый ввод сообщения, и

— Сервер веб-сокетов, который прослушивает новые сообщения, отправленные клиентами веб-сокетов.

На стороне клиента у нас есть HTML-страница с парой настроенных обработчиков, один для события нажатия кнопки «Отправить», который принимает входящее сообщение и отправляет его через веб-узел, а другой, который прослушивает новые входящие сообщения. на клиенте веб-сокетов (т. е. сообщения, отправленные другими пользователями, которые сервер теперь хочет, чтобы клиент отображал).

Когда один из клиентов отправляет сообщение, происходит следующее:

— Браузер улавливает нажатие кнопки «Отправить» через обработчик JavaScript, берет значение из поля ввода (то есть текст сообщения) и выдает сообщение через веб-сокет, используя клиент веб-сокета, подключенный к нашему серверу (инициализируемый при инициализации веб-страницы).

— Серверный компонент соединения websocket получает сообщение и пересылает его всем другим подключенным клиентам, используя метод широковещательной рассылки.

— Все клиенты получают новое сообщение как push-сообщение через клиентский компонент веб-сокетов, работающий на веб-странице. Затем они выбирают содержимое сообщения и обновляют веб-страницу на месте, добавляя новое сообщение на доску.

Браузер улавливает нажатие кнопки «Отправить» через обработчик JavaScript, берет значение из поля ввода (то есть текст сообщения) и выдает сообщение через веб-сокет, используя клиент веб-сокета, подключенный к нашему серверу (инициализируемый при инициализации веб-страницы).
Серверный компонент соединения websocket получает сообщение и пересылает его всем другим подключенным клиентам, используя метод широковещательной рассылки.
Все клиенты получают новое сообщение как push-сообщение через клиентский компонент веб-сокетов, работающий на веб-странице. Затем они выбирают содержимое сообщения и обновляют веб-страницу на месте, добавляя новое сообщение на доску.


Это самый простой пример .

Для более надежного решения вы можете использовать простой кеш на основе хранилища Redis. Или, в еще более продвинутом решении, очередь сообщений для обработки маршрутизации сообщений клиентам и более надежный механизм доставки, который может покрывать временные потери соединения или сохранять сообщения для зарегистрированных клиентов, пока они находятся в автономном режиме. Но независимо от внесенных вами улучшений, Node.js по-прежнему будет работать в соответствии с теми же основными принципами: реагировать на события, обрабатывать множество одновременных подключений и поддерживать плавность взаимодействия с пользователем.

API BD ОБЪЕКТОВ
Хотя Node.js действительно хорош для приложений реального времени, он вполне естественно подходит для отображения данных из объектных БД (например, MongoDB). Сохраненные данные JSON позволяют Node.js функционировать без несоответствия импеданса и преобразования данных.
Например, если вы используете Rails, вы должны конвертировать из JSON в бинарные модели, а затем предоставлять их обратно как JSON по HTTP, когда данные потребляются Backbone.js, Angular.js и т. Д., Или даже простым jQuery AJAX. звонки. С помощью Node.js вы можете просто предоставить доступ к своим объектам JSON с помощью REST API для использования клиентом. Кроме того, вам не нужно беспокоиться о преобразовании между JSON и чем-либо еще при чтении или записи из вашей базы данных (если вы используете MongoDB). В общем, вы можете избежать необходимости множественных преобразований, используя единый формат сериализации данных для клиента, сервера и базы данных.

ВХОДЫ В ОЧЕРЕДИ
Если вы получаете большое количество одновременных данных, ваша база данных может стать уязвимым местом. Как показано выше, Node.js может легко обрабатывать параллельные соединения самостоятельно. Но поскольку доступ к базе данных является блокирующей операцией (в данном случае), мы сталкиваемся с проблемами. Решение состоит в том, чтобы подтвердить поведение клиента до того, как данные будут действительно записаны в базу данных.
При таком подходе система сохраняет свою отзывчивость при большой нагрузке, что особенно полезно, когда клиенту не требуется твердое подтверждение успешной записи данных. Типичные примеры включают в себя: регистрацию или запись данных отслеживания пользователей, обрабатываемых партиями и не используемых до более позднего времени; а также операции, которые не нужно отображать мгновенно (например, обновление счетчика лайков на Facebook), где возможна согласованность (так часто используется в мире NoSQL).
Данные помещаются в очередь через какую-то инфраструктуру кэширования или очередей сообщений, такую ​​как RabbitMQ или ZeroMQ, и обрабатываются отдельным процессом пакетной записи базы данных или внутренними службами обработки с интенсивными вычислениями, написанными на более производительной платформе для таких задач. Подобное поведение может быть реализовано с другими языками /фреймворками, но не на том же оборудовании с такой же высокой поддерживаемой пропускной способностью.


Схема пакетной записи в базу данных в Node.js с очередью сообщений

Вкратце: с помощью Node вы можете отложить записи базы данных в сторону и обработать их позже, как если бы они были успешными.

ПЕРЕДАЧА ДАННЫХ
На более традиционных веб-платформах HTTP-запросы и ответы обрабатываются как изолированное событие; на самом деле это потоки. Это наблюдение можно использовать в Node.js для создания интересных функций.
Например, можно обрабатывать файлы, пока они еще загружаются, поскольку данные поступают через поток, и мы можем обрабатывать их в режиме онлайн. Это может быть сделано для кодирования аудио или видео в реальном времени и проксирования между различными источниками данных.

ПРОКСИ
Node.js легко использовать в качестве прокси на стороне сервера, где он может обрабатывать большое количество одновременных подключений неблокирующим образом. Это особенно полезно для проксирования различных сервисов с разным временем отклика или сбора данных из нескольких исходных точек.
Пример: рассмотрим серверное приложение, которое обменивается данными со сторонними ресурсами, извлекает данные из разных источников или хранит такие активы, как изображения и видео, в сторонних облачных сервисах.
Хотя выделенные прокси-серверы существуют, использование Node может быть полезным, если ваша прокси-инфраструктура отсутствует или вам нужно решение для локальной разработки. Под этим я подразумеваю, что вы можете создать клиентское приложение с сервером разработки Node.js для ресурсов и прокси-запросов / запросов API, в то время как в производстве вы будете обрабатывать такие взаимодействия с помощью выделенной прокси-службы (nginx, HAProxy и т.д.).

БРОКЕРСКАЯ ДЕЯТЕЛЬНОСТЬ — ПАНЕЛЬ ФОНДОВОГО ТРЕЙДЕРА
Вернемся к прикладному уровню. Другой пример, когда настольное программное обеспечение доминирует, но может быть легко заменено веб-решением в реальном времени, — это программное обеспечение брокеров, используемое для отслеживания цен на акции, выполнения расчетов / технического анализа и создания графиков / диаграмм.
Переход на веб-решение, работающее в режиме реального времени, позволит брокерам легко переключать рабочие станции или рабочие места. Вскоре мы можем начать видеть их на пляже во Флориде… или на Ибице… или на Бали.

ПАНЕЛЬ МОНИТОРИНГА ПРИЛОЖЕНИЙ
Еще один распространенный вариант использования, в котором идеально подходят Node-with-web-sockets: отслеживание посетителей веб-сайта и визуализация их взаимодействия в режиме реального времени.
Вы можете собирать статистику в реальном времени от своего пользователя или даже перемещать ее на следующий уровень, вводя целевые взаимодействия с вашими посетителями, открывая канал связи, когда они достигают определенной точки в вашей воронке.
Представьте, как вы могли бы улучшить свой бизнес, если бы знали, что делают ваши посетители в режиме реального времени — если бы вы могли визуализировать их взаимодействия. Благодаря двусторонним сокетам Node.js, работающим в реальном времени, теперь это возможно.

ПАНЕЛЬ МОНИТОРИНГА СИСТЕМЫ
Теперь давайте поговорим об инфраструктуре. Представьте себе, например, поставщика SaaS, который хочет предложить своим пользователям страницу мониторинга услуг, такую ​​как страница статуса GitHub. С помощью цикла событий Node.js мы можем создать мощную веб-панель управления, которая асинхронно проверяет статусы служб и отправляет данные клиентам с помощью веб-сокетов.
С помощью этой технологии можно сообщать о статусах как внутренних (внутри компании), так и государственных услуг в режиме реального времени. Продвиньте эту идею немного дальше и попытайтесь представить себе приложения мониторинга Центра сетевых операций (NOC) в операторе связи, облачном / сетевом / хостинг-провайдере или каком-либо финансовом учреждении, все они работают в открытом веб-стеке при поддержке Node.js и веб-сокетов. вместо Java и / или Java-апплетов.
Примечание: не пытайтесь создавать системы жесткого реального времени в Node (т.е. системы, требующие постоянного времени отклика). Erlang, вероятно, лучший выбор для этого класса приложений.
Где можно использовать Node.js

СЕРВЕРНЫЕ ВЕБ-ПРИЛОЖЕНИЯ
Node.js с Express.js также можно использовать для создания классических веб-приложений на стороне сервера. Однако, хотя это возможно, эта парадигма запроса-ответа, в которой Node.js будет переносить визуализированный HTML, не является наиболее типичным вариантом использования. Есть аргументы за и против такого подхода. Вот несколько фактов, которые следует учитывать:

Плюсы:

— Если в вашем приложении нет вычислений с интенсивным использованием CPU, вы можете построить его на Javascript сверху вниз, даже до уровня базы данных, если вы используете объектную базу данных хранилища JSON, такую ​​как MongoDB. Это значительно облегчает разработку (в том числе найм).

— Поисковые роботы получают полностью обработанный HTML-ответ, который гораздо более удобен для SEO, чем, скажем, одностраничное приложение или приложение для веб-сайтов, запущенное поверх Node.js.

Минусы:

— Любые вычисления с интенсивным использованием CPU будут блокировать реакцию Node.js, поэтому многопоточная платформа — лучший подход. В качестве альтернативы вы можете попробовать увеличить вычисление [*].

— Использование Node.js с реляционной базой данных по-прежнему вызывает затруднения (подробнее см. Ниже). Сделайте себе одолжение и выберите любую другую среду, например Rails, Django или ASP.Net MVC, если вы пытаетесь выполнять реляционные операции.

[*] Альтернативой этим вычислениям, интенсивно использующим CPU, является создание высокомасштабируемой среды с поддержкой MQ и внутренней обработкой, чтобы Node оставался внешним «клерком» для асинхронной обработки клиентских запросов.

Где нельзя использовать Node.js

Например, сравнивая Node.js с Express.js с Ruby on Rails, когда дело дошло до доступа к реляционным базам данных, таким как PostgreSQL, MySQL и Microsoft SQL Server, было однозначным решением в пользу последнего.
Инструменты реляционной BD для Node.js все еще находились на начальной стадии. С другой стороны, Rails автоматически обеспечивает настройку доступа к данным прямо из коробки вместе с инструментами поддержки миграции схемы BD и другими драгоценными камнями (каламбур). Rails и его одноранговые фреймворки имеют зрелые и проверенные реализации уровня доступа к данным Active Record или Data Mapper.

ВЫЧИСЛЕНИЕ / ОБРАБОТКА ТЯЖЕЛЫХ СЕРВЕРОВ
Когда дело доходит до тяжелых вычислений, Node.js — не лучшая платформа. Нет, вы определенно не хотите , чтобы построить вычислительный сервер Фибоначчи в Node.js . В общем, любая операция, интенсивно использующая CPU, аннулирует все преимущества пропускной способности, которые Node предлагает благодаря своей управляемой событиями неблокирующей модели ввода-вывода, потому что любые входящие запросы будут заблокированы, пока поток занят обработкой ваших чисел — при условии, что вы пытаетесь для выполнения ваших вычислений в том же экземпляре Node, с которым вы отвечаете на запросы.
Как указывалось ранее, Node.js является однопоточным и использует только одно ядро ​​CPU. Когда дело доходит до добавления параллелизма на многоядерный сервер, основная группа Node проделывает некоторую работу в виде кластерного модуля. Вы также можете легко запустить несколько экземпляров сервера Node.js за обратным прокси-сервером через nginx .
С кластеризацией вы все равно должны переложить все тяжелые вычисления на фоновые процессы, написанные в более подходящей для этого среде, и заставить их взаимодействовать через сервер очереди сообщений, такой как RabbitMQ.
Несмотря на то, что изначально ваша фоновая обработка может выполняться на том же сервере, такой подход может обеспечить очень высокую масштабируемость. Эти службы фоновой обработки можно легко распределить на отдельные рабочие серверы без необходимости настраивать нагрузку на внешние веб-серверы.
Конечно, вы бы использовали тот же подход и на других платформах, но с Node.js вы получите ту высокую пропускную способность запросов / сек, о которой мы говорили, поскольку каждый запрос — это небольшая задача, которая выполняется очень быстро и эффективно.

ВЫВОД

Мы обсудили Node.js от теории к практике, начиная с его целей и амбиций и заканчивая его слабыми местами и ловушками. Когда люди сталкиваются с проблемами с Node, это почти всегда сводится к тому, что блокирующие операции являются корнем всех зол — 99% злоупотреблений Node являются прямым следствием.

Помните: Node.js никогда не создавался для решения проблемы масштабирования вычислений. Он был создан для решения проблемы масштабирования ввода-вывода, с чем он действительно справляется .

Зачем использовать Node.js? Если ваш вариант использования не содержит операций с интенсивным использованием CPU и доступа к каким-либо блокирующим ресурсам, вы можете использовать преимущества Node.js и наслаждаться быстрыми и масштабируемыми сетевыми приложениями. Добро пожаловать в Интернет в реальном времени.

Обучение JavaScript, HTML, CSS, React.js на онлайн-платфоре по программированию. Попробовать бесплатно!

Поделиться
Интересные статьи:
Turing Bootcamp 20.09.2021 10 лучших книг, которые должен прочитать каждый программист 6. Жемчужины программирования Эта книга немного отличается от других классических книг в списке, но эта книга - одна из самых...
Turing Bootcamp 02.08.2021 Зачем использовать Redux и как он работает? Что такое управление состоянием в Redux? Управление состоянием - это, по сути, способ облегчить обмен данными и обмен данными между...
Turing Bootcamp 02.08.2021 Что такое Git? Git — абсолютный лидер по популярности среди современных систем управления версиями. Это развитый проект с активной поддержкой и открытым...