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