【问题标题】:Long polling using node.js to get database updates使用 node.js 进行长轮询以获取数据库更新
【发布时间】:2014-01-15 06:51:34
【问题描述】:
我是Node JS的新手,因为我从java服务器页面切换到node主要是为了实现服务器推送技术。
我想实现一个简单的应用程序,如果在 Mysql 数据库中插入任何新记录,它将向用户推送数据。
以数据库名为wst,表名为registered_people,表由一列users组成。
知道是否有任何记录被插入到表中,它应该通知一个新用户被添加到当前用户中。
我怎样才能做到这一点。
感谢您的帮助。
【问题讨论】:
标签:
mysql
node.js
long-polling
【解决方案1】:
这就是像 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; 不会给您的数据库增加太多开销。更清洁的解决方案是使用某种消息队列。如果您有多个系统在单个数据库上进行交互,则消息传递系统可以确保您让所有这些系统都有机会订阅系统其他部分中发生的事情。在这种情况下,您可以让您的节点应用订阅系统中的新用户消息并将它们发送到浏览器。
【解决方案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 将消息限制到一组特定的客户端