我正在使用node.js服务器在我的Web应用程序和数据库之间创建一个“接近实时”的套接字。目前我正在使用MySQL,我在节点中每秒轮询一次,以检查表中是否有任何更改(基于时间戳。)
我想知道是否有任何特定的技术可以用MySQL做这样的事情?目前,我只是在下次轮询之前运行SQL查询并使用setTimeout。
我知道在这样的实例中使用NoSQL数据库更常见,但我对这项技术并不熟悉,而且我更倾向于使用SQL。
有没有人有任何使用节点监控SQL数据库的经验或技巧?
答案 0 :(得分:11)
我个人不会为此使用轮询机制。我认为这是一个非常好的用例,它将pub / sub mq作为数据库之上的一个组件,允许消费者为他们关心的实体订阅特定渠道的变更事件。
例如:
您可以使用一个非常简单的进程发布/发布机制来使用节点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
});
这样你就不会对你的数据库施加愚蠢的民意调查压力。实际上,更改分发完全独立于写入数据库
约什
答案 1 :(得分:4)
我同意@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 ;
然后,您可以在此存储过程返回时查询数据库。知道某些事情已经改变,然后再次调用该程序等待结果。