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
,但永远不会忘记它,最终运行。
我有双重检查:
message
事件,并将其放在event pool
] 我也检查了可能的I / O主线程块 ,一切都很好。 所有的操作都是异步的,没有同步功能。
这种错误有时会表现出来,有时不会。 就像在console.js
等待之后,您可以打开另一个终端和console.js
并发送消息并查看它是如何立即响应的。 正如我已经告诉过的那样,它就像10的概率为1。
我该如何解决这个问题? 我做了很多调试。
链接地址: http://www.djcxy.com/p/52703.html