Node.js中何时应优先使用http模块而非http2模块?
Node.js中优先选用
http模块的适用场景 - 对接仅支持HTTP/1.1的存量系统/硬件:很多企业内部老旧业务系统、IoT设备、早年上线的第三方开放接口没有做HTTP/2兼容,用
http模块发起请求、启动服务可以直接适配,不需要额外处理协议降级、握手失败的问题。 - 开发资源受限场景下的轻量服务:
http模块是Node.js最早期的内置核心模块,运行时内存占用、冷启动速度都优于http2模块,在配额极低的Serverless函数、临时调试脚本、边缘计算节点场景下,用http模块的开销更小。 - 构建无需HTTP/2特性的内网服务:如果是做集群内部的服务间调用、内网管理后台接口,本身网络延迟极低,也不需要多路复用、服务端推送这类HTTP/2特性,
http模块完全能满足性能要求,不需要额外引入复杂度。 - 快速编写临时调试工具:
http模块的请求/响应模型非常简单,几行代码就能拉起一个临时接口、静态文件服务或者抓包代理,不需要理解HTTP/2的会话、流、流控等额外概念,开发效率更高。
生态普遍仍使用
http模块的核心原因 - 生态惯性和迁移成本极高:Node.js发展十几年,绝大多数成熟的Web框架、请求库、中间件、代理工具都是基于
http模块的API封装的,相关的问题排查方案、最佳实践、周边插件积累极多,要是把底层换成http2,几乎整个生态都要做适配,成本高到不现实。 http2模块本身使用门槛更高:和http模块简单的“一次请求对应一次响应”模型不同,http2是基于多路复用的长连接模型,要正确处理会话保活、流优先级、流控、异常断连重连等逻辑,对开发者的要求更高,普通业务场景下没必要花这个精力。- 多数场景下HTTP/2的性能收益感知不到:HTTP/2的速度优势主要体现在公网高延迟环境下、浏览器加载大量小体积静态资源的场景,而大部分Node.js开发者写的是后端接口、内网服务,本身网络延迟只有几毫秒,换
http2带来的性能提升几乎测不出来,反而可能因为对新模块不熟悉写出bug。 - 早期
http2模块稳定性口碑差:Node.js的http2模块在v15之前的长期支持版本里存在不少已知问题,比如内存泄漏、TLS握手异常、大文件传输丢包等,很多踩过坑的老开发者更愿意用经过十几年生产验证的http模块,不会贸然换用稳定性存疑的新模块。 - 上层框架已经屏蔽了协议差异:现在不少新的Web框架、HTTP客户端已经在底层做了自动协议协商,支持在需要的时候自动走HTTP/2,开发者不需要直接调用
http2模块的API就能用到对应能力,自然也就没有主动切换底层模块的必要。
内容的提问来源于stack exchange,提问作者Daavee18
相关产品推荐
相关产品推荐

