节点js降低了60个连接的性能

时间:2013-06-25 08:28:25

标签: performance node.js mobile connection

我正在使用NodeJS在memcache中放置标志。

这是代码:

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.disconect()之后添加socket.emit('checked',data.id)但它开始变慢。

有什么想法吗?

更新

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

2 个答案:

答案 0 :(得分:3)

不要在每次调用时连接到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();

答案 1 :(得分:1)

你打电话:

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变量被重用并且连接可能保持活动状态。但是 - 冒险。