Node.js - 监视数据库以进行更改

时间:2011-05-26 22:22:52

标签: node.js

我正在使用node.js服务器在我的Web应用程序和数据库之间创建一个“接近实时”的套接字。目前我正在使用MySQL,我在节点中每秒轮询一次,以检查表中是否有任何更改(基于时间戳。)

我想知道是否有任何特定的技术可以用MySQL做这样的事情?目前,我只是在下次轮询之前运行SQL查询并使用setTimeout。

我知道在这样的实例中使用NoSQL数据库更常见,但我对这项技术并不熟悉,而且我更倾向于使用SQL。

有没有人有任何使用节点监控SQL数据库的经验或技巧?

2 个答案:

答案 0 :(得分:11)

我个人不会为此使用轮询机制。我认为这是一个非常好的用例,它将pub / sub mq作为数据库之上的一个组件,允许消费者为他们关心的实体订阅特定渠道的变更事件。

例如:

  1. 有人要求更改模型
  2. 模型广播变更事件
  3. 将更改排队以保留在数据库中
  4. 触发消息队列中特定频道上的更改集,以便分发给所有感兴趣的各方
  5. 您可以使用一个非常简单的进程发布/发布机制来使用节点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 ;

然后,您可以在此存储过程返回时查询数据库。知道某些事情已经改变,然后再次调用该程序等待结果。