Node.JS事件循环套接字延迟或线程阻塞

Node.JS事件循环套接字延迟或线程阻塞,node.js,Node.js,我在发送大量并发请求时遇到node.js问题。问题在于,有时它似乎会在事件池的末尾提出一些请求,并在一段时间后(60秒以上,正常值不到10秒)给出响应 故事是这样的,我有3个脚本,一个控制台,一个服务器和10个客户端 console.js // sending message client.connect(port, host, function(connect_socket) { client.sendMessage(code:301,... some json-socket mess

我在发送大量并发请求时遇到node.js问题。问题在于,有时它似乎会在
事件池的末尾提出一些请求,并在一段时间后(60秒以上,正常值不到10秒)给出响应

故事是这样的,我有3个脚本,一个控制台,一个服务器和10个客户端

console.js

// sending message
client.connect(port, host, function(connect_socket)
{
    client.sendMessage(code:301,... some json-socket message ...);

    client.on('message', function(message)
    {
        if(message.code == 304)
        {
            console.log(... print data ...)
        }
    });
}
server = net.createServer(function(socket)
{
    socket = new JsonSocket(socket);

    socket.on('message', function(message)
    {
        if(message.code == 301)
        {
            var client_random = get_random_client();
            client_random.sendMessage(code:302,... some json-socket message ...);
        }

        if(message.code == 303)
        {
            var client_return = get_client_by_id(message.return_client_id);
            client_return.sendMessage(code:304,... some json-socket message ...);
        }
    });
    });

});
client.connect(port, host, function(connect_socket)
{
    client.on('message', function(message)
    {
        if(message.code == 302)
        {
            execute_command(message.data, function(result_command)
            {
                client.sendMessage(code:303,... some json-socket message (good or bad check) ...)
            });


        }
    });
}
server.js

// sending message
client.connect(port, host, function(connect_socket)
{
    client.sendMessage(code:301,... some json-socket message ...);

    client.on('message', function(message)
    {
        if(message.code == 304)
        {
            console.log(... print data ...)
        }
    });
}
server = net.createServer(function(socket)
{
    socket = new JsonSocket(socket);

    socket.on('message', function(message)
    {
        if(message.code == 301)
        {
            var client_random = get_random_client();
            client_random.sendMessage(code:302,... some json-socket message ...);
        }

        if(message.code == 303)
        {
            var client_return = get_client_by_id(message.return_client_id);
            client_return.sendMessage(code:304,... some json-socket message ...);
        }
    });
    });

});
client.connect(port, host, function(connect_socket)
{
    client.on('message', function(message)
    {
        if(message.code == 302)
        {
            execute_command(message.data, function(result_command)
            {
                client.sendMessage(code:303,... some json-socket message (good or bad check) ...)
            });


        }
    });
}
client.js

// sending message
client.connect(port, host, function(connect_socket)
{
    client.sendMessage(code:301,... some json-socket message ...);

    client.on('message', function(message)
    {
        if(message.code == 304)
        {
            console.log(... print data ...)
        }
    });
}
server = net.createServer(function(socket)
{
    socket = new JsonSocket(socket);

    socket.on('message', function(message)
    {
        if(message.code == 301)
        {
            var client_random = get_random_client();
            client_random.sendMessage(code:302,... some json-socket message ...);
        }

        if(message.code == 303)
        {
            var client_return = get_client_by_id(message.return_client_id);
            client_return.sendMessage(code:304,... some json-socket message ...);
        }
    });
    });

});
client.connect(port, host, function(connect_socket)
{
    client.on('message', function(message)
    {
        if(message.code == 302)
        {
            execute_command(message.data, function(result_command)
            {
                client.sendMessage(code:303,... some json-socket message (good or bad check) ...)
            });


        }
    });
}
体系结构概念,控制台向服务器发送消息,服务器向随机客户端发送消息,客户端执行外部程序并将输出发送回服务器,服务器向控制台发送响应并由控制台打印

console.js => server.js => client.js => server.js => console.js
我打开服务器,客户端连接没有问题。我打开控制台并键入命令,每次都会在10秒内得到响应

现在,我制作了另一个
PHP
脚本,它将每秒模拟600个请求。我做同样的事情,打开控制台,发送命令,每10次运行一次(10次中的1次),控制台等待,等待,等待,60秒后它会给我结果(10次正常)

我进行了一些调试,似乎
server.js
在从
client.js
接收消息时不会触发消息事件
,并且以某种方式将其放在
事件池的最末端,但永远不要忘记它,最终会运行

我有两张支票:

  • console.js每次都会向server.js发送消息(始终是即时的)
  • server.js每次都向client.js发送消息(始终是即时的)
  • client.js每次都向server.js发送消息(始终是即时的)
  • [server.js不要触发事件
    消息
    事件即时,并将其放入 在
    事件池的最末端
  • server.js每次都向client.js发送消息(始终是即时的)
  • 我还检查了可能的i/O主线程块,一切正常。所有操作都是异步的,没有同步功能

    正是这种缺陷,有时会显现出来,有时不会。就像在
    console.js
    等待之后,您可以打开另一个终端,然后
    console.js
    发送消息,并查看它如何立即响应。正如我已经说过的,它是10的1的概率


    我怎样才能解决这个问题?我做了很多调试。

    您使用的是什么操作系统?套接字耗尽是OSX的一个已知问题,并且有您描述的症状。Linux和Windows不受影响。Linux、Ubuntu(80%的服务器)和debian(20%的服务器)有时看起来像是
    套接字。on('message')
    没有立即触发,它被延迟到
    事件队列的末尾