Статьи

Как контролировать производительность приложений на базе Neo4j с Ruxit

За последние несколько лет Neo4j стал стандартом для эффективного моделирования графических данных.

Кроме того, использование Node.js в построении гибкой сервисной инфраструктуры поверх графовых баз данных Neo4j и обслуживании необходимых HTML и статических ресурсов позволяет разработчикам создавать великолепные приложения.

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

Если ваше приложение состоит из десятков различных сервисных вызовов, разбросанных по множеству HTML и асинхронных элементов JavaScript, то такие узкие места производительности чрезвычайно трудно найти.

В этой статье я объясню, как отслеживать пример приложения Node.js, используя базовую модель данных графа, находящуюся в базе данных Neo4j, в режиме реального времени.

Пример мониторинга производительности приложения Neo4j

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

Наш пример приложения визуализирует топологию приложений, как показано в следующем запросе Neo4j Cypher .

Топология-Neo4j-приложение

Чтобы визуализировать этот график в рамках нашего приложения Node.js для общественной аудитории, мы определили несколько услуг ( apprelationshostrelationsи  apps) , которые возвращают узлы приложения и хоста в виде JSON полезных нагрузок.

В этом примере импортируется экспресс-инфраструктура, которая обслуживает статическое содержимое, например HTML-страницу,  appgraph.html которая отображает результат с помощью JavaScript.


var neo4j = require('node-neo4j');
var express = require('express');
var app = express();

app.use(express.static('public'));

app.get('/apprelations', function (req, res) {
db = new neo4j('http://127.0.0.1:7474');
db.cypherQuery("MATCH (n:APPLICATION)-[r]-b RETURN n,b", function(err, result){
if(err) throw err;
// some processing
var rdata = { 'nodes': nodes, 'edges': edges};
res.send(rdata);
});
});

app.get('/hostrelations', function (req, res) {
db = new neo4j('http://127.0.0.1:7474');
db.cypherQuery("MATCH (n:HOST)-[r]-b RETURN n,b", function(err, result){
if(err) throw err;
// some processing
var rdata = { 'nodes': nodes, 'edges': edges};
res.send(rdata);
});
});

app.get('/apps', function (req, res) {
db = new neo4j('http://127.0.0.1:7474');
db.cypherQuery("MATCH (n:APPLICATION) RETURN n", function(err, result){
if(err) throw err;
// some processing
var rdata = { 'nodes': nodes, 'edges': []};
res.send(rdata);
});
});

var server = app.listen(8080, function () {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});

Работающее приложение визуализирует график на простой странице HTML / JavaScript, как показано ниже:

граф-оф-JavaScript

Как Ruxit помогает вам контролировать производительность приложений

Для мониторинга работы примера приложения мы установили Ruxit Agent на хост и вошли в Ruxit, чтобы исследовать автоматически обнаруженную службу и топологию приложения в представлении smartscape.

Агент Ruxit немедленно обнаружил запросы к веб-странице приложения и визуализировал служебную связь как запросов встроенного пользовательского интерфейса браузера Neo4j, так и запросов пользователей на  appgraph.html страницу.

Топология показывает, что Neo4j предоставляет семь сервисов баз данных, а наши сервисы приложений Node.js показаны в виде синего пути топологии с правой стороны.

узел-JS-топология-путь

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

Щелчок по узлу приложения в Smartscape показывает, что страница приложения имеет стабильный трафик около 40 запросов в минуту в период с 17:30 до 18:45 и что среднее время ответа составляет около 1 секунды.

Приложение-представлени-smartscape

Ruxit показывает, что приложение зависит от восьми отдельных сервисов (см. Ниже).

На этой странице службы для приложения Node.js представлен обзор производительности и количества ошибок служб Node.js. Справа вы видите самых популярных потребителей времени отклика в приложении Node.js. Эти основные потребители могут повлиять на общую производительность вашего приложения.

Узнайте, как Ruxit помогает вам с мониторингом производительности приложений с помощью приложений Neo4j

Щелчок по наиболее трудоемкой службе ( /hostrelations) показывает подробную статистику, связанную с временем отклика и частотой ошибок.

Изучив эту подробную диаграмму методов обслуживания, легко увидеть, что в 18:40 служба выполняла загрузку 43,5 запросов в минуту и ​​что она отвечала со средней производительностью 23 мс.

приложение-сервис-метод-чарт

Анализ производительности Neo4j не заканчивается здесь. На странице сервисов Ruxit вы узнаете, где искать узкие места в вашем приложении Neo4j.

Neo4j-приложение-Узкие

Вывод

Объединение многочисленных сервисов для создания высокодинамичных приложений Node.js с Neo4j предоставляет отличную возможность для разработчиков.

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

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

Эта статья была написана Вольфгангом Биром ( Wolfgang Beer) (технический менеджер по продукции, Ruxit)