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

发送大量并发请求时,我遇到了node.js的问题。 问题在于,有时候它似乎会在event pool末尾提出一些请求,并在一段时间后给出响应(60秒+,正常情况下不到10秒)。

故事是这样的,我有3个脚本,一个CONSOLE ,一个SERVER和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.js

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.js

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秒内得到响应。

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

我做了一些调试,看起来server.js在从client.js不会触发消息事件 ,并以某种方式将它放在 event pool ,但永远不会忘记它,最终运行。

我有双重检查:

  • console.js每次发送消息到server.js(总是即时)
  • server.js每次发送消息给client.js(总是即时的)
  • client.js每次发送消息到server.js(总是即时)
  • [server.js不会立即触发事件message事件,并将其放在event pool ]
  • server.js每次发送消息给client.js(总是即时的)
  • 我也检查了可能的I / O主线程块 ,一切都很好。 所有的操作都是异步的,没有同步功能。

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

    我该如何解决这个问题? 我做了很多调试。

    链接地址: http://www.djcxy.com/p/52703.html

    上一篇: Node.JS event loop socket delayed or thread blocked

    下一篇: Node.js killing an async call