我正在尝试使用版本 4 的 nodejs socket.io 创建一个应用程序。
我正在使用非常简单的脚本,该脚本接受连接并将事件(例如“loaddata”事件)上的 JSON 虚拟({“abc”:“abc”})有效负载发送到在事件调用时创建的套接字空间(如果尚未创建)。
在进行基准测试时,如果我尝试使用 100 个公共订阅(100 个房间)建立 1000 个连接,那么几秒钟后它就会开始给出几个套接字连接的断开错误。
服务器(运行套接字代码的地方)机器详细信息:8cpu,8Gb RAM。
使用 TOP 命令后,当我一次拍摄 1000 个连接(每个连接 100 个订阅)时,CPU 似乎超过 100%。
socket.io 中是否有一些限制,或者我犯了一些错误,或者这是该 conn 编号的 socket.io 的最大限制。 ?
//Server code :
const app = require('express')();
const server = require('http').Server(app);
const {
Server
} = require("socket.io");
const io = new Server(server, {
path: '/abc',
transports: ['websocket']
})
io.on('connection', async (socket) => {
socket.emit('broadcast', `Welcome to StreamerIO `)
socket.on('dataload', (data) => {
socket.join('datafeed_' + data.token);
sendFeed('datafeed_' + data.token);
});
});
const sendFeed = (room) => {
io.to(room).emit("getdata", {
"abc": "abc"
});
}
server.listen("7005", () => {
console.log(`Socket Server listening on ${server.address().address}:${server.address().port}`);
});
//Client Code :
const io = require("socket.io-client");
const connectFeed = async (subscription, tokens_list) => {
const socket = io('ws://localhost:7005/', {
path: "/abc",
transports: ['websocket']
});
socket.on("connect", () => {
function subscribetoken() {
if (socket.connected) {
if (tokens_list && tokens_list.length) {
tokens_list.forEach(token => {
socket.emit("dataload", {
token: token
});
});
}
}
}
function pingpong() {
socket.emit("3");
}
setTimeout(subscribetoken, 1000)
setInterval(pingpong, 1000)
});
socket.on('getdata', function(message) {
console.log("received data");
});
}
const startBenchMarking = (connections, subscription, tokens_list) => {
var runConnections = () => {
for (let i = 1; i <= connections; i++) {
connectFeed(subscription, tokens_list)
}
}
runConnections();
}
const NO_OF_CONNECTIONS = 1000;
const NO_OF_SUBSCRIPTIONS = 100;
const activetokens = ["a|1", "a|2", "a|3", ........] // an array of 100 diff tokens.
startBenchMarking(NO_OF_CONNECTIONS, NO_OF_SUBSCRIPTIONS, activetokens);
我尝试运行上面的脚本,但连接数不同。它运行良好,连接数高达 950 个。当连接数超过 1000 时就会出现断线问题。
期望:socket.io 中是否有一些限制,或者我犯了一些错误,或者这是该 conn 编号的 socket.io 的最大限制。 ?
这不是最大限制,甚至还没有接近。再说一遍,一切都取决于您的硬件
您发送的信息太多太快;至少对于初学者来说。
我刚刚调试了生产中遇到的类似问题。我们的服务器是短暂的,每 24 小时重新启动一次。当服务器重新启动时,连接的客户端都会“愚蠢地”同时尝试重新连接。服务器可以。处理大量连接,但如果你要求他在一秒钟内连接无数个客户端,它可能会失败。
Node 还需要运行其他任务,一个例子是垃圾收集器,用于处理不需要的引用并回收内存
这些问题加起来很快。服务器重新连接每个客户端的速度开始变慢。
但是您仍然以相同的速率发送连接。这个微不足道的金额很快就会增加。
最终服务器的问题变成了非线性,你会看到它的性能急剧下降,直到它很快耗尽可用资源并死亡。