Javascript Socket io vs Nodejs:2k并发用户时死亡?

Javascript Socket io vs Nodejs:2k并发用户时死亡?,javascript,node.js,sockets,Javascript,Node.js,Sockets,我的项目有一个模块。它需要实时将数据从json文件从服务器推送到客户端。我使用Socket IO和Nodejs来监听客户端。我的想法是服务器节点每5秒设置一次间隔并检查当前时间,如果有效,则读取json文件并发送到所有客户端。我尝试使用2k客户机,socket io和nodejs都死掉了。我从名为ttkqxs的文件夹中读取数据,文件名格式为1.json,2.json。阅读和推送非常好,但与2k客户端和更多我有麻烦。这是我的代码,有什么问题吗 // Dependencies var app = r

我的项目有一个模块。它需要实时将数据从json文件从服务器推送到客户端。我使用Socket IO和Nodejs来监听客户端。我的想法是服务器节点每5秒设置一次间隔并检查当前时间,如果有效,则读取json文件并发送到所有客户端。我尝试使用2k客户机,socket io和nodejs都死掉了。我从名为ttkqxs的文件夹中读取数据,文件名格式为1.json,2.json。阅读和推送非常好,但与2k客户端和更多我有麻烦。这是我的代码,有什么问题吗

// Dependencies
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require('fs');
var async = require('async');
// Time config
var MN_START_HOUR = 16,
    MN_START_MIN = 5,
    MN_END_MIN = 45,
    MT_START_HOUR = 17,
    MT_START_MIN = 5,
    MT_END_MIN = 45,
    MB_START_HOUR = 18,
    MB_START_MIN = 5,
    MB_END_MIN = 45;
var intervalTime = 5000;
var MB_ID = 22;
var MB = 1;
var MT = 2;
var MN = 3;
var firstTimeMb = true;
var firstTimeMt = true;
var firstTimeMn = true;

// Server ready
http.listen(3113, function () {
console.log('Server listening on port: 3113 ');
    var timer = setInterval(function () {
        var date = new Date();
        var min = date.getMinutes();
        var sec = date.getSeconds();
        var hour = date.getHours();
        console.log("CurrentTime: " + hour + ":" + min + ":" + sec);
        // Mien Bac
        if (hour === MB_START_HOUR && min >= MB_START_MIN && min <= MB_END_MIN) {
            if (firstTimeMb) {
                firstTimeMb = false;
                emitRegionData(MB, 'first_time_' + MB);
            }
            emitRegionData(MB, 'return_g_result_' + MB);
            emitProvincesData(MB);
        }
        // Miền Trung
        if (hour === MT_START_HOUR && min >= MT_START_MIN && min <= MT_END_MIN) {
            if (firstTimeMt) {
                firstTimeMt = false;
                emitRegionData(MT, 'first_time_' + MT);
            }
            emitRegionData(MT, 'return_g_result_' + MT);
            emitProvincesData(MT);
        }
        //Miền Nam
        if (hour === MN_START_HOUR && min >= MN_START_MIN && min <= MN_END_MIN) {
            if (firstTimeMn) {
                firstTimeMn = false;
                emitRegionData(MN, 'first_time_' + MN);
            }
            emitRegionData(MN, 'return_g_result_' + MN);
            emitProvincesData(MN);
        }

        // reset first time
        if (hour == 23) {
            firstTimeMb = true;
            firstTimeMt = true;
            firstTimeMn = true;
        }
    }, intervalTime);
});
/**
 * Get province data from json file and emit to all client
 * Desktop: Use in home page, province page
 * Mobile: Only use in province page
 * @param {int} pid Province id
 * @returns
 */
function emitProvinceData(pid) {
    var fileName = __dirname + '/ttkqxs/' + pid + '.json';
    fs.exists(fileName, function () {
        fs.readFile(fileName, function (err, content) {
            if (err) {
                throw err;
            }
            io.sockets.emit('return_p_result_' + pid, content);
        });
    });
}
/**
 * Get province data from json file and emit to all client
 * Desktop: Use in home page, province page
 * Mobile: Only use in province page
 * @param {int} pid Province id
 * @returns
 */
function emitProvincesData(rid) {
    var fileName = __dirname + '/ttkqxs/mien' + rid + '.json';
    fs.exists(fileName, function () {
        fs.readFile(fileName, function (err, content) {
            if (err) {
                throw err;
            }
            var ids = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(content)));
            for (var i in ids) {
                emitProvinceData(ids[i].id);
            }
        });
    });
}
/**
 * Emit Region data
 * Use in mobile for multiple province
 * @param {int} rid Region id
 * @returns
 */
function emitRegionData(rid, eventName) {
    var fileName = __dirname + '/ttkqxs/mien' + rid + '.json';
    fs.exists(fileName, function () {
        fs.readFile(fileName, function (err, content) {
            if (err) {
                throw err;
            }
            var ids = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(content)));
            var files = [];
            for (var i in ids) {
                var pFileName = __dirname + '/ttkqxs/' + ids[i].id + '.json';
                files.push(pFileName);
            }
            async.map(files, readAsync, function (err, results) {
                io.sockets.emit(eventName, JSON.stringify(results));
            });
        });
    });
}

/**
 * Read file Async
 * @param {string} file File Path
 * @param {function} callback
 * @returns
 */
function readAsync(file, callback) {
    fs.readFile(file, 'utf8', callback);
}
//依赖项
var app=require('express')();
var http=require('http')。服务器(应用程序);
var io=require('socket.io')(http);
var fs=需要('fs');
var async=require('async');
//时间配置
var MN_启动小时=16,
MN_开始_最小值=5,
MN_END_MIN=45,
MT\U开始时间=17小时,
MT\U START\U MIN=5,
MT_END_MIN=45,
MB_开始_小时=18,
MB_开始_最小值=5,
MB_END_MIN=45;
var间隔时间=5000;
var MB_ID=22;
var-MB=1;
var-MT=2;
var-MN=3;
var firstTimeMb=true;
var firstTimeMt=true;
var firstTimeMn=true;
//服务器就绪
http.listen(3113,函数(){
log('Server监听端口:3113');
变量计时器=设置间隔(函数(){
变量日期=新日期();
var min=date.getMinutes();
var sec=date.getSeconds();
var hour=date.getHours();
日志(“当前时间:+hour+:“+min+”:“+sec”);
//风采

如果(hour===MB_START_hour&&min>=MB_START_min&&min=MT_START_min&&min=MN_START_min&&min-Uhm…您能为我们提供错误的堆栈跟踪吗?我看到nodejs服务器不再工作,计时器没有运行,命令行中没有显示错误或日志消息。因此它没有响应。我要做的第一件事就是从m setInterval to setTimeout,以避免在下一次开始之前未完成上一次读取/广播的可能情况。但我的业务要求在内容文件更改时向所有客户端发送,因此我的解决方案是每5秒读取一次文件,如您所见,我认为没有响应:(是什么导致文件更改?最好的情况是仅在文件更改时发出,而不是每5秒发出一次。为什么要一次又一次地发出相同的数据?