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 ;
Затем вы можете запросить базу данных, когда эта хранимая процедура вернется. Знание чего-то изменилось, а затем снова вызвало процедуру, чтобы ждать результатов.