Node.js – 监视数据库的更改

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

我想知道是否有任何具体的技术来做这样的事情与MySQL? 目前,我只是运行一个SQL查询,并在下一轮投票之前使用setTimeout。

我知道在像这样的实例中使用NoSQL数据库更为常见,但是我对这项技术并不是很熟悉,我更愿意使用SQL。

有没有人有任何经验或技巧监测一个SQL数据库与节点?

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

例如:

  1. 有人要求改变一个模型
  2. 模型广播改变事件
  3. 排队等待在数据库中保存
  4. 在消息队列中的特定通道上启动更改,以分发给所有相关方

你可以使用一个非常简单的进程pub / sub机制来使用节点EventEmitter这种types的东西,并且当你需要扩展,有耐久性的需求,或者需要一个跨语言的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 }); 

这样你就不会把愚蠢的投票压力放在你的数据库上。 实际上,更改分配完全独立于写入数据库

玩笑

我同意@Josh给出的答案,但是如果由于某种原因你不得不监视一个MySQL数据库的状态,那么最好是执行任何轮询服务器端来显着减less服务器上的负载。 我曾经使用过的一种技术是创build一个存储过程,使用睡眠监视某个查询结果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 ; 

这个存储过程返回时,你可以查询数据库。 知道一些事情已经改变,然后再次调用程序来等待结果。