关于nodejs http请求 连接复用的一些问题
Agent 负责管理 HTTP 客户端的连接持久性和重用。 它为给定的主机和端口维护一个待处理请求队列,为每个请求重用单独的套接字连接,直到队列为空,此时套接字被销毁或放入连接池,以便再次用于请求到同一个主机和端口。 销毁还是放入连接池取决于 keepAlive 选项。
连接池中的连接已启用 TCP Keep-Alive,但服务器仍可能关闭空闲连接,在这种情况下,它们将从连接池中删除,并且当为该主机和端口发出新的 HTTP 请求时将建立新连接。 服务器也可以拒绝通过同一连接允许多个请求,在这种情况下,必须为每个请求重新建立连接,并且不能放入连接池。 Agent 仍将向该服务器发出请求,但每个请求都将通过新连接发生。
let express = require("express");
let app = express();
let http = require('http');
app.get("/", function (req, res) {
http.get({
hostname: 'ya.test.me',
port: 80,
path: '/',
agent: new http.Agent({keepAlive: true,})
}, (result) => {
console.log('STATUS: ' + result.statusCode);
result.on('data', chunk => {
console.log('BODY: ' + chunk);
});
res.send("hello");
});
});
app.listen(3000);
查看TCP连接状况
netstat -lnpa | grep :80 | grep -v 8080 | awk '{print $6}' | sort | uniq -c | sort -rn
1038 ESTABLISHED
1 LISTEN
如果不使用http.Agent 会造成很多等待
1659 TIME_WAIT
1 LISTEN
既占了连接,又没有复用,比短连接危害更大。http.Agent 对象改为了全局公用 数据正常
10 ESTABLISHED
1 LISTEN