最佳实践socket.io来广播消息

时间:2014-06-26 23:49:55

标签: database node.js web-services sockets socket.io

目前,我们正在尝试编写一个应用程序来对多个数据库环境(MSSQL,DB2,Oracle)进行运行状况检查。已经编写了一个Web服务来执行运行状况检查查询,该查询返回响应时间。

我认为不是Web客户端连接到webservice来返回数据库状态,而是使用节点socket.io服务器来运行webservice并将结果推送到所有webclients会更好,因为开销很大健康检查数据库将是最小的(在50人同时使用Web应用程序的情况下,每5秒仅进行一次web服务调用以进行健康检查,而不是同时进行50次web服务请求)。这样,即使有100万人正在使用网络应用程序,也不应以任何方式影响数据库。 (它会让节点服务器停机。)

这是代码的套接字端。我是节点和套接字的新手。我的下一步是将结果记录在本地mongodb中,只是广播更改(仅响应时间)而不是一切,以减少网络流量并可能绘制历史结果图表。我想知道如果客户端在其浏览器上有多个标签并且网络应用程序没有关注"那么socket.io是否可以断开连接。重新聚焦标签后重新连接到套接字。

只是想知道这是一个好方法还是有更好的方法来实现我的目标? 另外,将我的Web应用程序放在与节点套接字服务器相同的服务器上也是一个好主意,或者最好将它们分开?

var express = require('express')
, http = require('http');

var app = express();
var server = app.listen(3030);
var io = require('socket.io').listen(server);

var allClients = [];
io.sockets.on('connection', function(socket) {
    allClients.push(socket.client.id);
    console.log(allClients);
    socket.on('disconnect', function() {
        var i = allClients.indexOf(socket.client.id);
        console.log(allClients[i] + ' is disconnect!');

        delete allClients[i];
        allClients = allClients.filter(function(e){return e}); 
    });
});

var CronJob = require('cron').CronJob;

var job = new CronJob({
    cronTime: "*/5 * * * * *",
    onTick: function() {

        var request = require("request");
        request({
            url: "dbhealthcheck.json",
            method: "GET",
            timeout: 10000,
            json:true,
            followRedirect: true,
            maxRedirects: 10,
            pool: false
        }, function(error, response, body) {
            sendUpdates(body);
        });
    },
    start: true
});
job.start();

function sendUpdates(updates) {
    io.sockets.emit('updates', updates);
}

0 个答案:

没有答案