Nodejs 这样写 的话 超过 1000000 后就有问题了

Nodejs 这样写 的话 超过 1000000 后就有问题了

var uEvent; io.sockets.on(“connection”,function(s){ console.log(s.id);

 uEvent = s.id;
 s.send(uEvent);
 s.emit("get"+uEvent,"aaaaa");
 s.on("send"+uEvent,function(d){
		 console.log(d);
  })
 
});

想实现 匹配 的问题 ;

可以这么理解 a 和 b 聊天 c 和 d 聊天


8 回复

Node.js 在处理大量连接时的问题

问题描述

在使用 Node.js 处理大量连接(例如超过 1,000,000 个)时,上述代码可能会遇到性能瓶颈或内存泄漏等问题。主要原因在于每次有新用户连接时,都会创建一个新的事件处理器,并且这些处理器会持续占用内存。

示例代码分析

var uEvent;
io.sockets.on("connection", function(socket) {
    console.log(socket.id);

    uEvent = socket.id;
    socket.send(uEvent);
    socket.emit("get" + uEvent, "aaaaa");

    socket.on("send" + uEvent, function(data) {
        console.log(data);
    });
});

具体问题

  1. 内存泄漏:每次有新用户连接时,新的 socket 对象会被创建并存储在内存中。如果用户数量非常大,这些对象会累积起来,导致内存使用量急剧增加。
  2. 性能问题:随着用户数量的增加,事件处理器的数量也会增加,这会导致服务器的性能下降。每个 socket 都有自己的事件处理器,这增加了 CPU 的负担。
  3. 代码可维护性:每次连接都会创建一个特定的事件处理器,这使得代码难以管理和维护。如果需要对所有连接进行全局操作,这种分散的结构会变得复杂。

解决方案

为了优化上述代码,可以考虑以下几种方法:

  1. 使用事件中心:将所有连接的事件处理器集中管理,而不是为每个连接单独创建。
  2. 清理不必要的资源:确保在连接断开时清理相关的资源。
  3. 使用更高效的数据结构:如 Map 或 WeakMap 来存储和管理 socket 对象。

示例改进代码

const sockets = new Map();
io.sockets.on("connection", function(socket) {
    const uEvent = socket.id;
    sockets.set(uEvent, socket);

    socket.send(uEvent);
    socket.emit("get" + uEvent, "aaaaa");

    socket.on("send" + uEvent, function(data) {
        console.log(data);
    });

    // 清理资源
    socket.on("disconnect", function() {
        sockets.delete(uEvent);
        console.log(`Socket ${uEvent} disconnected`);
    });
});

总结

通过将所有连接的 socket 对象集中管理,并在断开连接时清理资源,可以有效避免内存泄漏和性能问题。这样可以更好地应对大规模的并发连接场景。


有没有错误打印?聊天可以用soecket.io的room,或者参考其实现。

http://psitsmike.com/2011/10/node-js-and-socket-io-multiroom-chat-tutorial/ 可能支持的并发数,还不如你目前的方法呢。

“连接中断”

樓主什麼配置的機器。。。。。100W 一直以為單機50W併發就已經是極限了

好吧 mac pro 2012款

只能默默膜拜大牛了!求分享,求指导!

根据你提供的代码片段,问题在于当连接数超过一定数量(例如1000000)时,内存和性能可能会出现问题。这可能是因为每个新的客户端连接都会创建一个新的事件监听器,从而导致内存泄漏或性能下降。

示例代码分析

原始代码

var uEvent;
io.sockets.on('connection', function(socket) {
    console.log(socket.id);
    
    uEvent = socket.id;
    socket.send(uEvent);
    socket.emit("get" + uEvent, "aaaaa");
    
    socket.on("send" + uEvent, function(data) {
        console.log(data);
    });
});

问题分析

  1. 全局变量 uEvent: 使用全局变量 uEvent 是一个坏习惯,因为每次新连接时都会覆盖该变量。
  2. 重复的事件监听器: 每次新的连接都会创建一个新的事件监听器 socket.on("send" + uEvent, ...),这会导致大量不必要的内存占用。
  3. 效率问题: 随着连接数增加,事件监听器的数量也会线性增长,导致性能下降。

改进建议

改进后的代码

io.sockets.on('connection', function(socket) {
    const socketId = socket.id;
    console.log(socketId);

    // 发送初始数据
    socket.emit('initialData', { id: socketId });

    // 监听来自特定socket的消息
    socket.on('chatMessage', function(data) {
        console.log(`Received message from ${socketId}:`, data);
    });

    // 处理聊天逻辑
    socket.on('disconnect', function() {
        console.log(`${socketId} disconnected`);
    });
});

解释

  1. 避免使用全局变量:用局部变量 socketId 存储 socket.id,避免全局变量污染。
  2. 简化事件监听器:只设置必要的事件监听器,例如 chatMessagedisconnect
  3. 优化内存管理:减少不必要的内存占用,提高程序性能。

通过这些改进,即使连接数达到1000000,也能更好地管理和处理事件,避免内存泄漏和性能瓶颈。

回到顶部