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


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

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

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

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


12521
2018-05-26 22:22


起源

我会使用内存(堆)存储引擎。然后保持一个开放的连接并查询更改都发生在RAM(内存)中,这是非常快的,应该没问题。 - haknick
这是否阻止我在其他地方正常使用该表?我需要能够在我的应用程序的其他地方查询同一个表。 - Hanpan
一点也不。但是,当服务器关闭时(或者如果mysqld停止),所有数据都将丢失。这意味着如果您想保持数据的持久性,您可能需要将其保存到间隔中的另一个表中或使用某种逻辑。 - haknick
dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html - haknick
igvita.com/2011/05/27/streamsql-event-processing-with-esper   - 一个完全不同的工具集,但最接近你想要的。您可能会重新考虑使用pubsub机制(Redis,CouchDB)切换到数据库。 - Ricardo Tomasi


答案:


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

例如:

  1. 有人要求更改模型
  2. 模型广播改变事件
  3. 将更改排队以保留在数据库中
  4. 触发消息队列中特定通道上的更改集,以便分发给所有相关方

您可以使用一个非常简单的进程发布/发布机制来使用节点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
});

这样你就不会对数据库施加愚蠢的轮询压力。实际上,更改分发完全独立于写入数据库

玩笑


11
2018-05-26 23:02





我同意@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 ;

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


3
2018-06-27 18:37