现象
正常情况下,基于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();
}