Nodejs Socket.io v4 在 1000 个连接(每个连接 100 个订阅)上出现断开问题

问题描述 投票:0回答:1

我正在尝试使用版本 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 的最大限制。 ?

javascript node.js websocket socket.io node-modules
1个回答
0
投票

这不是最大限制,甚至还没有接近。再说一遍,一切都取决于您的硬件

您发送的信息太多太快;至少对于初学者来说。

我刚刚调试了生产中遇到的类似问题。我们的服务器是短暂的,每 24 小时重新启动一次。当服务器重新启动时,连接的客户端都会“愚蠢地”同时尝试重新连接。服务器可以。处理大量连接,但如果你要求他在一秒钟内连接无数个客户端,它可能会失败。

Node 还需要运行其他任务,一个例子是垃圾收集器,用于处理不需要的引用并回收内存

这些问题加起来很快。服务器重新连接每个客户端的速度开始变慢。

但是您仍然以相同的速率发送连接。这个微不足道的金额很快就会增加。

最终服务器的问题变成了非线性,你会看到它的性能急剧下降,直到它很快耗尽可用资源并死亡。

  • 一种解决方案是不在同步循环中发送已连接的客户端。
  • 重新考虑使用 Websocket。您一定需要它。它是具有长期连接的有状态协议。内存泄漏、笨拙的连接和重新连接、无法轻松地加载分发它们和粘性的沃土。
© www.soinside.com 2019 - 2024. All rights reserved.