NodeJS + MySQL + Socket.IO:更新数据库

我目前正在寻找一个关于NodeJS和MySQL数据库推送通知的解决scheme。

我想结合NodeJS和Socket.IO来提供推送通知,但问题是,我不知道如何问我的服务器来检查是否有从我的数据库更新。

我已经有了一个完美的“轮询”方法,但它有点混乱,这在服务器调用和响应方面并没有真正的优化。

所以这个想法是,当用户A在我的数据库中插入一些东西时,所有跟随他的客户端都会被push(推送,而不是轮询)通知。

这是我现在为我的server.js:

var app = require('http').createServer(handler), io = require('socket.io').listen(app), fs = require('fs'), mysql = require('mysql'), connectionsArray = [], connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'root', database : 'nodejs' }), POLLING_INTERVAL = 5000, pollingTimer; connection.connect(function(err) { console.log( err ); }); app.listen(1337); function handler ( req, res ) { fs.readFile( __dirname + '/client.html' , function ( err, data ) { if ( err ) { console.log( err ); res.writeHead(500); return res.end( 'Error loading client.html' ); } res.writeHead( 200 ); res.end( data ); }); } var pollingLoop = function () { var query = connection.query('SELECT notif FROM notifications WHERE id_user=1 AND status=0'), users = []; .on('error', function(err) { console.log( err ); updateSockets( err ); }) .on('result', function( user ) { users.push( user ); }) .on('end',function(){ if(connectionsArray.length) { pollingTimer = setTimeout( pollingLoop, POLLING_INTERVAL ); updateSockets({users:users}); } }); }; io.sockets.on( 'connection', function ( socket ) { console.log('Number of connections:' + connectionsArray.length); if (!connectionsArray.length) { pollingLoop(); } socket.on('disconnect', function () { var socketIndex = connectionsArray.indexOf( socket ); console.log('socket = ' + socketIndex + ' disconnected'); if (socketIndex >= 0) { connectionsArray.splice( socketIndex, 1 ); } }); console.log( 'A new socket is connected!' ); connectionsArray.push( socket ); }); var updateSockets = function ( data ) { data.time = new Date(); connectionsArray.forEach(function( tmpSocket ){ tmpSocket.volatile.emit( 'notification' , data ); }); }; 

如果您有任何build议,解决scheme或其他有用的东西,请不要犹豫。

提前致谢

我可以在这里想到两个解决scheme。

1)从上传新信息的相同请求开始推送。 我的意思是,你现在的stream量可能是:

  1. 从客户端获取请求
  2. 把东西插入数据库
  3. 返回到客户端

使用Node,您可以在发送响应之后做更多的事情。 例如1.从客户端获取请求2.将内容插入到数据库中3.返回到客户端4.查找正在订阅和当前login的所有订阅者5.发送推送

2)这种方法更分散。 您可以使用发布/订阅方法进行最后的步骤。 有一个不同的进程处理所有推送,并让您的主进程(处理更新请求的部分)将新内容发布到队列中。 这会在每次有新内容时提醒您的推送过程,这比查询数据库要好得多。

请注意,对于这些解决scheme中的任何一种,您都必须find一个跟踪哪些套接字连接到哪个客户端的好方法,以便您可以从套接字之外快速地将消息发送到特定的客户端。 这样做的一个快速方法可能是将每个用户添加到他们自己的房间,以他们的用户名或user_id命名,以便您可以轻松地将更新推送到以订阅用户命名的房间的所有参与者。 如果没有人在房间里,没有请求被发送。