【问题标题】:Node js slow performance on 60 connectionsNode js 在 60 个连接上性能缓慢
【发布时间】:2013-06-25 08:28:24
【问题描述】:

我正在使用 NodeJS 将标志放入内存缓存中。

这是代码:

var app = require('express')()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server);

var memcache = require('memcache');

var client = new memcache.Client();

server.listen(3005);

io.sockets.on('connection', function (socket) {
    socket.emit('connected');
    
    socket.on('check',function(data){
    
        client.on('connect', function(){
           console.log('connect');
        });

        client.connect();
        
        client.set(data.id, 1, function(error, result){
    
            console.log('Key added');
            console.log(result);
            
            client.get(data.id, function(error, result){

                socket.emit('checked',data.id);

            });
        },600);
    });
});

同时我有大约 60 个连接。

一些用户抱怨此代码需要大约 10-12 秒才能加载。

在socket.emit('checked',data.id) 之后添加了socket.disconect(),但它开始工作较慢。

有什么想法吗?

更新

所有用户都使用 Android / iOS 原生浏览器。

【问题讨论】:

  • 对于那些滞后的用户来说,网络/浏览器是个问题。如果他们的传输方法是长轮询,那么这种延迟可能是由于这个原因,特别是在不受支持的浏览器上。尝试记录所有传入连接的传输以检查这一点。还有更多的代码。

标签: performance node.js mobile connection


【解决方案1】:

不要在每次调用时都连接到 memcached,而是重用现有连接:

var app = require('express')()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server);

var memcache = require('memcache');

var client = new memcache.Client();

server.listen(3005);

client.on('connect', function() {
    console.log('connect');

    io.sockets.on('connection', function (socket) {
        socket.emit('connected');

        socket.on('check',function(data){
            client.set(data.id, 1, function(error, result){

                console.log('Key added');
                console.log(result);

                // maybe unnecessary, just check if error is present
                client.get(data.id, function(error, result){
                    socket.emit('checked',data.id);
                });
            },600);
        });
    });
});

client.connect();

【讨论】:

  • 有趣的想法,很多连接可以杀死服务器。将尝试并告知结果。
  • 现在无法现场测试,但这个答案值得赏金。
【解决方案2】:

你打电话:

client.connect();

但您相应的连接处理程序仅记录一条消息,而不是执行您想要执行的操作。

client.on('connect', function(){
  console.log('connect');
});

你有一个函数:

client.set(data.id, 1, function(error, result){
  console.log('Key added');
  console.log(result);
  client.get(data.id, function(error, result){
    socket.emit('checked',data.id);
  });
},600);

.. 确实应该包含在 client.on("connect") 处理程序中,所以我想知道为什么您的代码会成功?

可能您第一次或最初几次访问 memcached 的尝试失败但随后成功,因为 client 变量被重复使用并且连接可能保持活动状态。但是 - 有风险。

【讨论】:

  • 没注意到。谢谢。但这是性能的主要问题吗?忘记写了,所有用户都使用Android/iOS原生浏览器。
  • 连接后(到socket.io,而不是memcached)代码运行很快,但是加载socetio.js和连接需要很多时间。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多