【问题标题】:NodeJS + MySQL + Socket.IO : Update databaseNodeJS + MySQL + Socket.IO:更新数据库
【发布时间】:2013-03-05 11:48:32
【问题描述】:

我目前正在寻找有关使用 NodeJS 和 MySQL 数据库推送通知的解决方案。

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

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

所以想法是,当用户 A 在我的数据库中插入某些内容时,所有关注他的客户都会通过推送(推送,而不是轮询)得到通知。

这是我目前为我的 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 );
    });
};

如果您有任何建议、解决方案或有用的东西,请不要犹豫。

提前致谢

【问题讨论】:

  • 您可以尝试使用 setInterval 在一段时间后调用以获取数据库更新

标签: mysql node.js websocket push-notification


【解决方案1】:

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

1) 从上传新信息的同一请求发起推送。我的意思是,您现在的流程可能是:

  1. 从客户端获取请求
  2. 将内容插入数据库
  3. 返回客户端

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

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

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

【讨论】:

  • 感谢您的解决方案。我要检查他们两个,看看哪个更有效率!我的想法是我的轮询版本运行良好(不是很难),但是使用 NodeJS 进行轮询有点“巨大”(我可以在没有 NodeJS 的情况下进行轮询)。如果我有一个解决方案,我会在这里为大家发布。再次感谢
  • 第二种解决方案类似于轮询数据库,但是您的应用程序基本上会说“嘿,现在有新的东西给你!”,而不是你不断地问“嘿,你有什么要给我吗? ?”
猜你喜欢
  • 2018-03-08
  • 2017-11-27
  • 2018-06-07
  • 2013-09-20
  • 1970-01-01
  • 2018-09-23
  • 2015-02-11
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多