Node.JS事件循环套接字延迟或线程阻塞
我在发送大量并发请求时遇到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
事件池的末尾提出一些请求,并在一段时间后(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')
没有立即触发,它被延迟到事件队列的末尾