2015-11-17 2 views
0

Я пытаюсь опросить базу данных MySQL, итерируя каждые 2 секунды и получая все записи, созданные менее чем 2 секунды назад.Опрос MySQL DB в Socket IO & Node JS

Если я использую setInterval, он, кажется, иногда пропускает запись. Если я использую setTimeout, он выполняет только первую итерацию.

Как я могу получить данные более надежно, чтобы включить все данные?

io.on('connection', function(socket) { 
    authorize (socket, function(shop_id) { 
     setInterval(function() { 
      var sql = "SELECT * FROM `stats` WHERE `shop_id` = " + connection.escape(shop_id) + 
      " AND `created` > DATE_SUB(NOW(), INTERVAL 2 SECOND)"; 
      var query = connection.query(sql, function(err, rows, fields) { 
       if (err == null) { 
        console.log (rows); 
        socket.emit('newData', rows); 
       } 
      }); 
     }, 2000); 
    }); 
}); 

ответ

2

MySQL не предназначен для вытягивания каждые 2 секунды. Это не архитектура системы godo, и позже вы столкнетесь с дополнительными проблемами, определенно в отношении масштабируемости.

setInterval не точен и не гарантирует, что он будет спать в течение абсолютного 2000 мс, он может спать в течение 2001, 2200 или даже 50 часов.

Чтобы устранить эту проблему, храните последние created, что ваш NodeJS-скрипт выбран в переменной и извлекает все строки, созданные после получения последнего created. Это приведет к каждой записи и не пропустят записи.

io.on('connection', function(socket) { 


authorize (socket, function(shop_id) { 
     setInterval(function() { 
      var lastCreated = toMySQLDate(new Date()); 
      var sql = "SELECT * FROM `stats` WHERE `shop_id` = " + connection.escape(shop_id) + 
      " AND `created` > " + lastCreated + " ORDER BY `created` DESC"; 
      var query = connection.query(sql, function(err, rows, fields) { 
       if (err == null) { 
        if (rows.length) { 
         lastCreated = toMySQLDate(rows[0].created); 
        } 
        console.log (rows); 
        socket.emit('newData', rows); 
       } 
      }); 
     }, 2000); 
    }); 
}); 

function toMySQLDate(date) { 
    return date.toISOString().slice(0, 19).replace('T', ' '); 
} 
+0

'toMySQLDate()' также необходимо использовать там, где обновляется 'lastCreated'. Это не позволит мне редактировать пример кода. Также опечатка в SQL '=' должна быть '+' –

+0

Данные статистики не обязательно связаны с другими таблицами в базе данных. Какой будет лучший выбор хранилища данных для частых опросов в отношении масштабирования? –

+0

RabbitMQ: https://github.com/squaremo/rabbit.js – apscience

Смежные вопросы