Использование Node.js технологии как платформу для оптимизации серверных мощностей

в 6:56, , рубрики: node.js, npm, supervisor, web-sockets
image

Web-программирование стремительно развивается и появляется необходимость выбора между сформировавшимися языками такими как PERL, C++ и Java и современными веб-ориентированными или прототипно-ориентироваными языками как например Ruby или Go. Один из таких языков является JavaScript. Много лет присутствовало мнение что JavaScript это клиентоориентированный язык программирования и будущего у него нет, но после того как компания Google выпустила стабильную версию JavaScript-движка V8 появился Node.js и его стали использовать как совершенно новой идеи, серверного JavaScript.

Node.js продолжает развиваться динамически и амбициозно. Так например, в течении нескольких последних лет разработчиками было добавлено около 200 000 модулей для Node.js, это превышает в несколько раз темпы развития уже устоявшихся серверных языков, таких как Perl у которого количество модулей в репозитории меньше. Так же нужно подчеркнуть что технология Node.js набирает обороты и используется такими компаниями, как Yahoo, Microsoft, PayPal и LinkedIn не говоря уже про гугл.

Node.js рассчитан на задачи, имеющим веб-инфраструктуру и мобильные приложения, в back-end которых надо в режиме real-time вносить изменения, используя архитектуру, построенную на базе микросервисов. Node.js способен существенно сократить время на разработку приложения, не меняя при этом логику приложения.

Node.js так же подходит для приложений, построенных на базе архитектуры микросервисов, из-за низкого потребления ресурсов процессора, своему эффективному использованию ОЗУ и вычислительной мощности. В большей степени это заметно в задачах, связанных с операциями, потребляющими много памяти на ввод/вывод, нежели на использование процессора, так как подход к реализации модели выполнения Node.js позволяет симулировать параллельность задачи, опираясь на модели согласованного потока выполнения, которая не требует сложных техник параллельного программирования.

Использование Node.js технологии как платформу для оптимизации серверных мощностей - 2

Для построения собственных решений могут применяться уже готовые модули, которые просто адаптируются к конкретному проекту. Так например одним из самых распространенных Web application framework является “Express”, база данных может использоваться как реляционная (MySql) так и нереляционная (MongoDB), так же можно использовать различные модули для варификации и форматирования данных.

Установка Node.js и NPM под Linux (Ubuntu 16.04):

sudo apt-get install nodejs
sudo apt-get install npm

Установка библиотек WS, FS, Mysql и MongoDB из NPM:

npm install ws  //установка веб-сокет модуль
npm install fs //установка модуля для работы с файловой системой
npm install mysql // установка mysql модуля
npm install –g mongodb //установка mongodb модуля глобально

Пример установки соединения с базой данных:

var url = 'mongodb://127.0.0.1:27017';
var db = '/your_collection';

// init DB
var MongoClient = require('mongodb').MongoClient;
// connect with mongo
MongoClient.connect(url + db, function (err, mongoclient) {
     if (err) {throw err}
     var db_object = mongoclient.collection('collection');
     db_object.find({_id:some_id});
});

Для запуска nodejs скрипта нужно вызвать команду находясь в той же директории где вы устанавливали npm пакеты, т.е. на одном уровне с папкой «node_modules»:

nodejs путь_к_файлу/имя_файла.js

Благодаря тому что Node.js имеет отличный инструмент, NPM — менеджер пакетов, c помощью его можно управлять модулями и зависимостями. Его легко использовать и масштабировать в рамках серверного окружения. Так например используя Node.js для нескольких проектов мы можем устанавливать пакеты/модули как глобально так и локально.

Так же есть ряд дополнительных инструментов для комфортной работы с Node.js. Так например для поддержания процессов используют утилиты: forever или supervisor. Первая устанавливается из менеджера пакетов NPM и служит только для поддержания процессов Node.js, в то время как второй умеет работать и с другими утилитами такими как RabbitMQ, Bash Scripts и тем самым является более универсальной. Так же существует модуль supervisor который устанавливается как пакет для Node.js и играет роль наблюдателя за изменениями в скрипте и автоматического перезапуска без утечки памяти ОЗУ и без очистки межмодульных зависимостей.

Установка Supervisor:

sudo apt-get install supervisor

Файл конфигурации supervisor находится в директории: /etc/supervisor/

Для включения доступа через web-интерфейс нужно добавить в файл /etc/supervisor/supervisord.conf:

[inet_http_server]
port=*:9001
username=логин
password=пароль

Для проекта необходимо создать файл конфигурации запуска node.js скрипта в директории:
/etc/supervisor/conf.d/файл.conf:

[program:имя_проекта]
directory=/путь/к/проекту
command=nodejs путь_к_файлу/имя_файла.js
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/имя_файла.err.log
stdout_logfile=/var/log/supervisor/имя_файла.out.log

Так же Node.js имеет ряд модулей для логгирования, самые популярные (log4j, winston, bunyan, intel). Они позволяют логгировать как сценарий приложения так и непосредственно системные сообщения (ERROR, WARN, INFO, DEBUG, TRACE). Для возврата ошибок в функции может быть реализован синхронный подход (throw) или асинхронный подход (callback-функция или событие), но нельзя реализовывать оба подхода в одной функции. При использовании функции, чтобы обрабатывать возникающие в ней ошибки, нужно будет применять либо callback-функции, либо конструкцию try/catch.

Node.js так же умеет работать с файлами для этого он использует модуль FS из сборщика пакета NPM. Его огромный плюс над другими модулями в том что практически все функции по обработке файлов имеют два типа синхронное чтение и асинхронное чтение файла. Так же модуль умеет работать как с данными в разных кодировках, так и с целыми, дробными числами, с числами в формате Double и т.д.

Пример работы асинхронного чтения файла (без ожидания):

var fs = require('fs');
fs.readFile('путь', 'utf8', function(err, data) {
  console.log(data);
});
console.log('after readFile');

Пример работы синхронного чтения файла (с ожиданием):

var fs = require('fs');
var data = fs.read
FileSync('путь', 'utf8');
console.log(data);

image

image

image

Несмотря на то, что Node.js не стремится занять место других языков программирования. Он уже показал себя как многообещающая технология. Говоря про серверные решения на основе web-sockets для web и mobile-application, Node.js уверено защищает свои позиции.

Автор: Fedoskin

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js