Node.js - мониторинг базы данных для изменений

Я использую сервер node.js для создания сокета "close to real-time" между моим веб-приложением и базой данных. В настоящее время я использую MySQL, который я каждый месяц пробовал в node, чтобы проверить, есть ли какие-либо изменения в таблице (на основе метки времени.)

Мне было интересно, есть ли какие-то конкретные методы для создания чего-то подобного с MySQL? На данный момент я просто запускаю SQL-запрос и используя setTimeout перед следующим опросом.

Я знаю, что чаще всего использовать базу данных NoSQL в таких случаях, но мне не очень нравится эта технология, и я бы предпочел использовать SQL.

Есть ли у кого-нибудь опыт или советы по мониторингу базы данных SQL с помощью node?

Ответ 1

Я бы лично не использовал для этого механизм опроса. Я думаю, что это довольно хороший вариант использования для pub/sub mq в качестве компонента поверх базы данных, что позволяет потребителям подписываться на определенные каналы для событий изменений для объектов, которые им интересны.

Пример:

  • Кто-то просит изменить модель.
  • Модель трансляции события изменения
  • Изменение очереди в базе данных
  • Погасить набор изменений на определенном канале в очереди сообщений для распространения всем заинтересованным сторонам.

Вы можете использовать очень простой в процессе pub/sub механизм для этого типа вещей, используя узлы EventEmitter, и, поскольку вам нужно масштабировать, иметь требования к долговечности или использовать перекрестный язык MQ, вы можете перейти к такой технологии, как rabbitmq, zeromq и т.д. Я начал реализовывать что-то очень легкое, чтобы сделать это в одном из моих приложений: https://github.com/jmoyers/mettle/blob/master/src/pubsub.coffee

Это сводится к чему-то вроде:

pubsub.sub('users.*', function(updates){
    // Interested party handles updates for user objects
});

Таким образом, вы не ставите глупое давление на вашу базу данных. Фактически, распределение изменений полностью не зависит от записи в вашу базу данных

Джош

Ответ 2

Я согласен с ответом, данным @Josh, однако если по какой-либо причине вы вынуждены следить за состоянием базы данных MySQL, лучше всего выполнить любую серверную часть опроса, чтобы значительно снизить нагрузку на сервер. Одним из таких методов, который я использовал, является создание хранимой процедуры, которая контролирует некоторый результат запроса N раз со сном.

DELIMITER //

CREATE PROCEDURE waitForResults(OUT c INT)
BEGIN
  DECLARE n INT DEFAULT 20;
  DECLARE x INT;

  WHILE n > 0 DO
    SELECT SLEEP(0.5) INTO x;
    SELECT COUNT(*) FROM `jobs` INTO c;
    IF (c > 0) THEN SET n = 0;
    ELSE SET n = n - 1;
    END IF;
  END WHILE;

END //

DELIMITER ;

Затем вы можете запросить базу данных, когда эта хранимая процедура вернется. Знание чего-то изменилось, а затем снова вызвало процедуру, чтобы ждать результатов.