socket.io 表现 node.js
socket.io performance with node.js
所以,我有一个 node.js 服务器,它从手机 (GPS) 接收数据。服务器虽然会进行一些计算以找出速度或距离。
我正在使用 socket.IO 来传输数据,并使用网络客户端可视化它们。
这是我的问题:当我模拟 500 部手机时,插座会掉线。在套接字崩溃之前,我只能在网页上可视化我的数据几秒钟。
我读了一些像这样的文章:https://bocoup.com/weblog/node-stress-test-analysis/
作者可以打开10000个客户端...所以我不明白为什么我不能!
有人知道问题出在哪里吗?
谢谢
编辑
服务器:4096 Mo 内存和 1 个 vCPU。
服务器代码:
var app = express();
// creation
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var httpsIO = require('socket.io').listen(httpsServer);
// config du port
// HTTP
var port = 8080;
server.listen(port);
套接字:
var mongoose = require('mongoose');
module.exports = function(server)
{
var io = require('socket.io').listen(server);
io.sockets.setMaxListeners(0);
io.sockets.on('connection', function (socket) {
var d;
var address = socket.handshake.address;
socket.emit('connection_ok');
socket.on('join', function (ids) {
var datas = new Array();
if(ids.split(' ').length > 1)
{
var coureur_id = ids.split(' ').shift();
var course_id = ids.split(' ').pop();
participant(coureur_id, course_id, function(coureur_id, course_id, date)
{
d = date;
socket.emit('ack', coureur_id);
socket.join(coureur_id);
});
}
else
{
var course_id = ids;
getParticipants(course_id, function(participants)
{
if(participants != null)
{
for(var j=0; j<participants.length; j++)
{
socket.join(participants[j].user_id)
}
}
});
}
// Mobil phone update the position
socket.on('commit', function (pos)
{
var fini = false;
if (pos)
{
if (pos['latitude'] && pos['longitude'])
{
if (pos['speed'] != undefined)
{
if (pos['distance'] != undefined)
{
// datas sent to the database (mongoDB)
addCoureurData(coureur_id, course_id, pos, d, datas, fini, function(res)
{
datas = res.datas;
var classement = res.classement;
pourcentAccompli(course_id,coureur_id,pos, datas, function(result)
{
socket.broadcast.to(coureur_id).emit('update', { user : coureur_id, latitude : pos['latitude'], longitude : pos['longitude'], vitesse : pos['speed'], distance : pos['distance'], classement : classement, pourcent : result});
});
});
}
}
}
}
});
});
});
}
假设代码设计本身没有任何错误,您的服务器可以处理的并发连接数将因多种因素而异。分配给节点应用程序的 RAM、打开文件限制(如果涉及文件系统)和一般硬件设置只是一些重要因素。此外,服务器端实际发生的处理类型会影响并发连接阈值。
所以,我有一个 node.js 服务器,它从手机 (GPS) 接收数据。服务器虽然会进行一些计算以找出速度或距离。 我正在使用 socket.IO 来传输数据,并使用网络客户端可视化它们。
这是我的问题:当我模拟 500 部手机时,插座会掉线。在套接字崩溃之前,我只能在网页上可视化我的数据几秒钟。 我读了一些像这样的文章:https://bocoup.com/weblog/node-stress-test-analysis/ 作者可以打开10000个客户端...所以我不明白为什么我不能!
有人知道问题出在哪里吗?
谢谢
编辑
服务器:4096 Mo 内存和 1 个 vCPU。
服务器代码:
var app = express();
// creation
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var httpsIO = require('socket.io').listen(httpsServer);
// config du port
// HTTP
var port = 8080;
server.listen(port);
套接字:
var mongoose = require('mongoose');
module.exports = function(server)
{
var io = require('socket.io').listen(server);
io.sockets.setMaxListeners(0);
io.sockets.on('connection', function (socket) {
var d;
var address = socket.handshake.address;
socket.emit('connection_ok');
socket.on('join', function (ids) {
var datas = new Array();
if(ids.split(' ').length > 1)
{
var coureur_id = ids.split(' ').shift();
var course_id = ids.split(' ').pop();
participant(coureur_id, course_id, function(coureur_id, course_id, date)
{
d = date;
socket.emit('ack', coureur_id);
socket.join(coureur_id);
});
}
else
{
var course_id = ids;
getParticipants(course_id, function(participants)
{
if(participants != null)
{
for(var j=0; j<participants.length; j++)
{
socket.join(participants[j].user_id)
}
}
});
}
// Mobil phone update the position
socket.on('commit', function (pos)
{
var fini = false;
if (pos)
{
if (pos['latitude'] && pos['longitude'])
{
if (pos['speed'] != undefined)
{
if (pos['distance'] != undefined)
{
// datas sent to the database (mongoDB)
addCoureurData(coureur_id, course_id, pos, d, datas, fini, function(res)
{
datas = res.datas;
var classement = res.classement;
pourcentAccompli(course_id,coureur_id,pos, datas, function(result)
{
socket.broadcast.to(coureur_id).emit('update', { user : coureur_id, latitude : pos['latitude'], longitude : pos['longitude'], vitesse : pos['speed'], distance : pos['distance'], classement : classement, pourcent : result});
});
});
}
}
}
}
});
});
});
}
假设代码设计本身没有任何错误,您的服务器可以处理的并发连接数将因多种因素而异。分配给节点应用程序的 RAM、打开文件限制(如果涉及文件系统)和一般硬件设置只是一些重要因素。此外,服务器端实际发生的处理类型会影响并发连接阈值。