使用node.js进行长轮询以获取数据库更新

时间:2014-01-15 06:51:34

标签: mysql node.js long-polling

我是Node JS的新手,因为我从java服务器页面切换到节点主要是为了实现服务器推送技术。

我想实现一个简单的应用程序,如果在Mysql数据库中插入任何新记录,它将把数据推送给用户。

以数据库名称为wst,表名为registered_people,表由一列名为users组成。

知道是否有任何记录插入表中,它应该通知新用户被添加到当前用户。

我怎样才能做到这一点。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

这就是像socket.io这样的图书馆的设计目标。它使服务器推送操作变得微不足道。

至于如何实际触发服务器推送,根据您将数据导入数据库的方式,这可能会更复杂。如果进出mysql数据库的所有数据都通过相同的节点应用程序,那么它非常简单。只需在表中插入一个事件,然后让你的socket.io(或其他推送代码)监听这些事件。然后,每次添加用户时,都会发送消息。

如果从多个应用程序更新数据库,事情会变得有点棘手。您可以轮询数据库以获取用户表的更新,然后在更改时获取最新用户。您可以执行以下操作:

setInterval(function() {
  getUserCount(function(userCount) {
    if(userCount > originalUserCount) {
      //  We have new users!
      //  Get the latest user and send it to the connected browsers.
    } 
  });
}, 1000);

这不是很有效,但执行SELECT COUNT(id) FROM Users;不会给数据库增加太多开销。更清洁的解决方案是使用某种消息传递队列。如果您有多个系统在单个数据库上进行交互,则消息传递系统可以确保您为所有这些系统提供订阅系统其他部分中发生的事情的机会。在这种情况下,您可以让您的节点应用程序订阅系统中的新用户消息并将它们发送到浏览器。

答案 1 :(得分:2)

http://socket.io/正是您要找的。

如文档中所示,使用socket.io

在服务器上监听非常简单
var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

使用

连接到它
var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
});

只要数据库状态发生变化,就可以通过使用io.sockets.emit(object);向所有连接的客户端广播更新来实现推送。

还可以使用rooms

将邮件限制为特定的一组客户端