Мы создаем приложение GPS-отслеживания в реальном времени на базе данных node.js и mysql (драйвер node-mysql2).
Сервер представляет собой простой TCP-сервер, который принимает входящие данные от устройств GPS, анализирует их и записывает в таблицу mysql. Устройства GPS подключаются к серверу, резервируют сокет, а затем начинают отправлять пакеты данных о местоположении (и другие). Устройства отправляют данные каждые 10 секунд, и каждый пакет данных требует выполнения 6 запросов.
Он отлично работает до 100 устройств или около того. Но когда вы пытаетесь использовать 1000 нечетных устройств, он начинает тихо давать сбой. Для 1000 устройств это будет около 600 нечетных запросов в секунду.
После того, как около 700 устройств войдут в систему и начнут отправлять данные, наша система резко перестанет вставлять данные в таблицу mysql. Он не выдает никаких ошибок, и кажется, что сервер работает хорошо. Сервер продолжает принимать данные от устройств и продолжает их анализировать. Наши операторы console.log выполняются, и мы видим, что поток кода выполняется до конца без каких-либо ошибок. Просто mysql не вставляется после определенного момента времени (в нашем случае около 4-5 минут с момента запуска и когда около 700 устройств вошли в систему).
Мы используем этот метод для подключения к Mysql —
var mysql = require('mysql2');
var connection = mysql.createConnection({
host : 'localhost',
port : 3306,
database : sample
user : sample
password : pwd
});
connection.connect(function(err) {
if(err){console.log("couldnt connect to mysql" + err)};
console.log("connected to mysql");
});
var sql_query1 = "SELECT `dt_tracker` FROM gs_tracker_data_"
+ imei + " ORDER BY dt_tracker DESC LIMIT 1" ;
connection.query(sql_query1, function(err,rows,fields)
{
if (err) { console.log("sql_query1 " + err); return; }
if(rows.length != 0)
{
//processing
}
});
var sql_query4 = "INSERT INTO gs_tracker_data_"
+ imei
+ " (`dt_server`, `dt_tracker`, `lat`, `lng`, " +
"`altitude`, `angle`, `speed`, `signal_gsm`, " +
"`signal_gps`, `offset`, `params`) VALUES ('"
+ decoded_data.dt_server + "','"
+ decoded_data.dt_tracker + "'," + decoded_data.lat
+ "," + decoded_data.lng + ","
+ 0 + "," + decoded_data.angle + ","
+ decoded_data.speed + "," + decoded_data.signal_gsm
+ "," + decoded_data.signal_gps + "," + 0 + ",'"
+ params + "')";
connection.query(sql_query4, function(err,rows)
{
if (err) { console.log("sql_query4 " + err); return; }
});
База данных Mysql среднего размера (сейчас размер mysqldump составляет около 35 ГБ). Это очень простая структура данных с 30 маленькими (‹1000 строк) и 1000 большими таблицами (более 5 миллионов строк). Из того, что мы можем понять, ни nodejs, ни mysql не должны отказывать при такой нагрузке - 600-700 простых вставок в секунду.
Мы также используем redis.io для хранения часто необходимых статических данных. Эта часть, кажется, работает без сучка и задоринки.
Любые мысли о том, что мы должны проверить?
PS Мы запускаем это на Windows Server 2008