За последние несколько лет Neo4j стал стандартом для эффективного моделирования графических данных.
Кроме того, использование Node.js в построении гибкой сервисной инфраструктуры поверх графовых баз данных Neo4j и обслуживании необходимых HTML и статических ресурсов позволяет разработчикам создавать великолепные приложения.
Как и в случае с другими технологиями, модель данных и дизайн сервиса предопределяют, насколько хорошо ваше приложение работает в производстве. Но что, если вы уже запускаете приложение в работе и понимаете, что в некоторых случаях оно работает медленно?
Если ваше приложение состоит из десятков различных сервисных вызовов, разбросанных по множеству HTML и асинхронных элементов JavaScript, то такие узкие места производительности чрезвычайно трудно найти.
В этой статье я объясню, как отслеживать пример приложения Node.js, используя базовую модель данных графа, находящуюся в базе данных Neo4j, в режиме реального времени.
Пример мониторинга производительности приложения Neo4j
В качестве первого шага мы автоматически обнаружим служебные зависимости в вашем приложении. После этого мы сможем отслеживать загрузку каждой из ваших служб и время отклика ваших приложений и запросов на обслуживание.
Наш пример приложения визуализирует топологию приложений, как показано в следующем запросе Neo4j Cypher .
Чтобы визуализировать этот график в рамках нашего приложения Node.js для общественной аудитории, мы определили несколько услуг ( apprelations
, hostrelations
и 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, как показано ниже:
Как Ruxit помогает вам контролировать производительность приложений
Для мониторинга работы примера приложения мы установили Ruxit Agent на хост и вошли в Ruxit, чтобы исследовать автоматически обнаруженную службу и топологию приложения в представлении smartscape.
Агент Ruxit немедленно обнаружил запросы к веб-странице приложения и визуализировал служебную связь как запросов встроенного пользовательского интерфейса браузера Neo4j, так и запросов пользователей на appgraph.html
страницу.
Топология показывает, что Neo4j предоставляет семь сервисов баз данных, а наши сервисы приложений Node.js показаны в виде синего пути топологии с правой стороны.
Изучив топологию вновь созданного приложения, интересно посмотреть, какой трафик получает страница приложения от реальных пользователей, и как этот трафик влияет на нагрузку и производительность служб Node.js.
Щелчок по узлу приложения в Smartscape показывает, что страница приложения имеет стабильный трафик около 40 запросов в минуту в период с 17:30 до 18:45 и что среднее время ответа составляет около 1 секунды.
Ruxit показывает, что приложение зависит от восьми отдельных сервисов (см. Ниже).
На этой странице службы для приложения Node.js представлен обзор производительности и количества ошибок служб Node.js. Справа вы видите самых популярных потребителей времени отклика в приложении Node.js. Эти основные потребители могут повлиять на общую производительность вашего приложения.
Щелчок по наиболее трудоемкой службе ( /hostrelations
) показывает подробную статистику, связанную с временем отклика и частотой ошибок.
Изучив эту подробную диаграмму методов обслуживания, легко увидеть, что в 18:40 служба выполняла загрузку 43,5 запросов в минуту и что она отвечала со средней производительностью 23 мс.
Анализ производительности Neo4j не заканчивается здесь. На странице сервисов Ruxit вы узнаете, где искать узкие места в вашем приложении Neo4j.
Вывод
Объединение многочисленных сервисов для создания высокодинамичных приложений Node.js с Neo4j предоставляет отличную возможность для разработчиков.
Кроме того, мониторинг и анализ сервисных зависимостей и производительности является решающим фактором в создании реактивных приложений, которые обеспечивают высокие стандарты удобства использования.
Использование полнофункциональных решений для мониторинга производительности следующего поколения, таких как Ruxit, поможет вам следить за производительностью приложений и зависимостями служб в режиме реального времени.
Эта статья была написана Вольфгангом Биром ( Wolfgang Beer) (технический менеджер по продукции, Ruxit)