现象

正常情况下,基于nodejs的http通信应用,在发送http.request时不管你是否使用agent和timeout/keepAlive,客户端和服务器之间的连接数不会太多。但下面情况下,在请求频繁时连接数可能会快速增长并且不会释放:

客户端

http.request(...)

服务器端

  1. express().use("/",(req,res)=>{
  2. return; //不回应
  3. res.send(`responed by server`);
  4. res.end();
  5. });

也就是说如果服务端没有正确响应,连接将会一直存在,不管客户端如何调整请求参数。

解决方法

要解决这个问题,有两个地方可以处理:

服务端及时响应请求

  1. express().use("/",(req,res)=>{
  2. res.send(`responed by server`);
  3. res.end();
  4. });

这种情况下,客户端无论是否使用agent,是否keepAlive,连接数都不会太多。

客户端超时后强制关闭

  1. let req = http.request(...)
  2. req.on('timeout', function() {
  3. console.error("request time out!");
  4. //强制关闭连接
  5. req.destroy();
  6. });

客户端优化

  1. const express = require("express");
  2. const http = require('http');
  3. const agent = new http.Agent({
  4. keepAlive: true,
  5. timeout:2000
  6. });
  7. function post(host,port,path,content,callback) {
  8. var data = '';
  9. var options = {
  10. agent: agent,
  11. hostname: host,
  12. port: port,
  13. path: path,
  14. method: 'POST',
  15. timeout:2000,
  16. headers: {
  17. 'Content-Type': 'application/json; charset=UTF-8',
  18. 'Connection': 'Keep-Alive'
  19. }
  20. };
  21. var req = http.request(options, function(res) {
  22. res.setEncoding('utf8');
  23. res.on('data', function(chunk) {
  24. data = data + chunk;
  25. });
  26. res.on('end', () => {
  27. callback(null,data);
  28. });
  29. });
  30. req.on('error', function(e) {
  31. callback("error",e);
  32. });
  33. //这是重点
  34. req.on('timeout', function() {
  35. req.destroy();
  36. callback("timeout");
  37. });
  38. req.write(content);
  39. req.end();
  40. }