当前位置: 首页 > news >正文

在 Node.js 中使用 HTTP Agent 实现 keep-alive

不带 Keep-Alive 的请求

我们都知道,浏览器中多个 HTTP 请求是可以通过请求头connection: keep-alive;来复用 TCP 连接的,但是在 Node.js 中怎么实现呢?

比如,下面是一段简单的发起请求的代码:

// server.js const http = require('http') http .createServer((req, res) => { res.writeHead(200) res.end('Hello World') }) .listen(3000) // client.js const http = require('http') function request() { http .request( { host: 'localhost', port: 3000, pathname: '/', }, (res) => { let buffer = [] res.on('data', (chunk) => { buffer.push(chunk) }) res.on('end', () => { console.log(buffer.toString()) }) } ) .end() } request() setTimeout(() => { request() }, 5000)

当我们用 wireshard 抓包分析时,我们发现两次请求的 client 端口是不同的,并且有两个“三次握手”的过程:

使用 http.Agent 发送带有 Keep-Alive 的请求

现在,让我们使用http.Agent来实现keep-alive请求,我们只需要加少量的代码:

// client.js const http = require('http') const agent = new http.Agent({ keepAlive: true, }) function request() { http .request( { host: 'localhost', port: 3000, pathname: '/', agent }, (res) => { let buffer = [] res.on('data', (chunk) => { buffer.push(chunk) }) res.on('end', () => { console.log(buffer.toString()) }) } ) .end() } request() setTimeout(() => { request() }, 5000)

maxSockets表示每个 host 所能建立的最大 TCP 连接数。其默认值是Infinity。如果我们不指定它的值,那每个 HTTP 请求都会建立一个 TCP 连接。

const agent = new http.Agent({ keepAlive: true, maxSockets: 1, })

接下来,我们修改一下代码:

setTimeout(() => { request() }, 10000) // 1000 -> 10000

keep-alive又不生效了!并且我们可以看到服务端 5s 左右后发送了一个 FIN 的包。难道有什么参数可以控制keep-alive的超时时间么?确实,也就是keepAliveTimeout,我们把它设置为 10s:

const http = require('http') const server = http .createServer((req, res) => { res.writeHead(200) res.end('Hello World') }) .listen(3000) server.keepAliveTimeout = 10000

现在keep-alive又可以工作了。

总结

首先 Node.js 的 http 库提供三个主要的函数: http.request, http.get, http.createServer。前两个函数主要是为了创建 http 客户端,向其它服务器发送请求,http.get 只是 http.request 的发送 get 请求的便捷方式;而 http.createServer 是为了创建 Node 服务,比如 Koa 服务框架就是基于 http.createServer 封装的。

而 http.Agent 主要是为 http.request, http.get 提供代理服务的,用于管理 http 连接的创建,销毁及复用工作。http.request, http.get 默认使用 http.globalAgent 作为代理,每次请求都是“建立连接-数据传输-销毁连接”的过程,如果我们想让多个请求复用同一个 connection,则需要重新定义 agent 去覆盖默认的 http.globalAgent,下面我们看一下新建一个agent的需要哪些主要参数:

keepAlive:{Boolean} 是否开启 keepAlive,多个请求公用一个 socket connection,默认是 false。 maxSockets:{Number} 每台主机允许的socket的最大值,默认值为Infinity。 maxFreeSockets:{Number} 处于连接池空闲状态的最大连接数, 仅当开启 keepAlive 才有效。 let http = require('http'); const keepAliveAgent = new http.Agent({ keepAlive: true, maxScokets: 1000, maxFreeSockets: 50 }) http.get({ hostname: 'localhost', port: 80, path: '/', agent: keepAliveAgent }, (res) => { // Do stuff with response });


只有向相同的 host 和 port 发送请求才能公用同一个 keepAlive 的 socket 连接,如果开启 keepAlive ,同一时间内多个请求会被放在队列里等待;如果当前队列为空,该 socket 处于空闲状态,但是不会被销毁,等待下一次请求的到来。

使用 keepAlive 代理,有效的减少了建立/销毁连接的开销,开发者可以对连接池进行动态管理。

大体差不多就是这个意思,详细可以看Node.js 官方文档

http://www.cnnetsun.cn/news/3797315.html

相关文章:

  • 从FAQ到问题解决地图:构建高价值知识库的实战方法论
  • 3大关键步骤解决Windows 7网络性能测试难题:iperf3兼容性终极方案
  • Germinal AI:表位靶向抗体设计的生成式人工智能流程详解
  • 树莓派4B官方显示屏套件深度评测:一体化设计、即插即用与项目实战
  • 终极指南:3步轻松解密网易云音乐NCM格式,实现音乐自由播放
  • 如何轻松下载在线视频:N_m3u8DL-CLI-SimpleG完整使用指南
  • Element Plus:Vue 3企业级UI组件库核心特性与实战指南
  • Spark大数据实战:网约车数据分析平台构建与性能调优
  • 终极视频画质增强指南:用Video2X让老旧视频焕发新生
  • WSaiOS数字企业管理系统工程
  • 3分钟快速掌握图像矢量化:用vectorizer将PNG/JPG无损转为SVG的完整指南
  • 数据安全法下,企业用在线压缩工具到底违不违规?
  • 解决CUDA安装后nvcc命令找不到:PATH环境变量配置详解
  • AI智能体协同开发游戏:从Claude Opus 5到多智能体框架实战
  • ZenlessZoneZero-OneDragon:模块化游戏自动化框架的设计哲学与技术实现
  • YOLOv5数据标注实战:labelImg工具详解与高效标注指南
  • SIM808模块物联网开发全攻略:从AT指令到车辆追踪器实战
  • DRG Save Editor 终极指南:3步解锁《深岩银河》所有资源与超频模组
  • 速卖通AI图片翻译API集成实战
  • Neon wal日志处理流程
  • 3步搞定:为Windows 11 LTSC系统恢复微软商店的完整指南
  • 基于LLaVA与LoRA微调:从零构建多模态AI厨房助手
  • 计算机底层基石:整型进制转换原理、编程实现与实战避坑指南
  • Midscene.js终极指南:如何用AI视觉驱动实现零代码跨平台自动化测试
  • LLaMA Factory模型微调
  • 【C】零基础教我学会c语言(十一)
  • DDR内存频率全解析:从核心时钟到XMP超频实战指南
  • SQL报错注入实战:原理、函数与绕过技巧详解
  • 树莓派系统重刷进阶指南:从数据迁移到安全擦除的完整工程实践
  • Android Studio中文语言包终极指南:3分钟打造你的中文开发环境