现象
正常情况下,基于nodejs的http通信应用,在发送http.request时不管你是否使用agent和timeout/keepAlive,客户端和服务器之间的连接数不会太多。但下面情况下,在请求频繁时连接数可能会快速增长并且不会释放:
客户端
http.request(...)
服务器端
express().use("/",(req,res)=>{return; //不回应res.send(`responed by server`);res.end();
});
也就是说如果服务端没有正确响应,连接将会一直存在,不管客户端如何调整请求参数。
解决方法
要解决这个问题,有两个地方可以处理:
服务端及时响应请求
express().use("/",(req,res)=>{res.send(`responed by server`);res.end();
});
这种情况下,客户端无论是否使用agent,是否keepAlive,连接数都不会太多。
客户端超时后强制关闭
let req = http.request(...)
req.on('timeout', function() {console.error("request time out!");//强制关闭连接req.destroy();
});
客户端优化
const express = require("express");
const http = require('http');const agent = new http.Agent({keepAlive: true,timeout:2000
});function post(host,port,path,content,callback) {var data = '';var options = {agent: agent,hostname: host,port: port,path: path,method: 'POST',timeout:2000,headers: {'Content-Type': 'application/json; charset=UTF-8','Connection': 'Keep-Alive'}};var req = http.request(options, function(res) {res.setEncoding('utf8');res.on('data', function(chunk) {data = data + chunk;});res.on('end', () => {callback(null,data);});});req.on('error', function(e) {callback("error",e);});//这是重点req.on('timeout', function() {req.destroy();callback("timeout");});req.write(content);req.end();
}