代码座右铭:要检查redis pub / sub性能,我试图在node.js中循环发出http请求。
问题:假设我的循环范围从0到10000,当我运行节点时,它将循环发送post请求。它按预期工作到120秒。在Socket挂起后,该节点抛出错误。检查解决方案时,我发现该节点的默认套接字超时为2分钟。
问题: 1.问题是否会通过更改默认超时来解决? 2.如果是这样,我们如何更改默认值。 3.除了更改套接字超时值之外,还有其他方法可用于解决此问题吗?
代码:
var clientNo = 100000,a=0;
var express = require('express'),
app = express(),
http = require('http'),
server = http.createServer(app);
http.globalAgent.maxSockets = Infinity;
app.enable('trust proxy');
app.disable( 'x-powered-by' );
app.use(express.bodyParser());
app.use(app.router);
app.set('port', 6002);
server.listen(app.get('port'));
var postint= setInterval(function(){
makeSubscription(a,function(query){
var options = {
path:query,
port: '6001',
method: 'POST'
};
var req = http.request(options, function(response){
response.on('end', function () {
console.log("Ends");
});
});
req.on('error', function (e) {
console.log(e);
});
req.end();
});
a++;
if(a == clientNo)
{
clearInterval(postint);
}
},1);
注意:我发送另一个帖子请求到不同路径上的同一端口,时间为1秒setTimeout。
答案 0 :(得分:0)
问题可能不在于超时,而是response
是simply sitting idle throughout the duration。
请注意,
end
事件不会触发,除非数据已完全耗尽。这可以通过切换到流动模式,或通过反复调用read()
直到你结束来完成。
这是因为节点0.10及更高版本中的Streams don't automatically stream anything。
在您指示您已准备好接收数据之前,可读流将不会开始发送数据。
启动它有三个选项:
使用'data'
设置流动模式:
response.on('data', function (chunk) {
console.log(data.toString());
});
response.on('end', function () {
console.log('End');
});
使用'readable'
和.read()
设置非流动模式:
response.on('readable', function () {
var chunk;
while (chunk = response.read()) {
console.log(chunk.toString());
}
});
response.on('end', function () {
console.log('End');
});
明确地告诉.resume()
:
response.resume();
response.on('end', function () {
console.log('End');
});
答案 1 :(得分:0)
您是否从服务器发送有效回复?错误“socket hangup”看起来像是等待响应的超时。请检查您的服务器代码或尝试从Postman等其他客户端发帖,并确保您收到回复。
答案 2 :(得分:0)
代码可以简单地编写,以完成相同的工作。
var a=0,clientNo = 10;
var http=require('http');
var sub = setInterval(function(){
var temp = '/?channel=channel'+a;
var options = {
host:'127.0.0.1',
port:'6001',
path:temp,
method:'POST'
};
a++;
var req = http.request(options,function(res){
res.on('data', function(chunk) {
console.log('data');
});
res.on('error', function(err) {
console.log(err);
});
res.on('end', function() {
console.log('end');
});
});
req.on('error',function(err){
console.log(Date());
});
req.end();
if(a== clientNo)
{
clearInterval(sub);
}
},1);
也可以同样的方式发送更多请求。