如果你想要从Node.js向HTTP服务器发送通信,可以使用ConnectionPool
首先
最近我偶尔使用Node.js,并且像下图(※1)所示,当Node.js的Web服务器通过HTTP访问外部的API服务器时,启用连接池会改善延迟和吞吐量,建议考虑一下。这种方法不仅适用于Node.js,而且非常容易实现(可能)。

版本
-
- nodejs: v4.2.3
-
- npm
request: 2.67.0
request-promise: 1.0.2
ConnectionPool的方法
看起来有几种方法可供选择。
-
- 请使用 NPM 的 forever
- 使用 nodejs 的 http 模块中提供的功能
请使用 NPM 的 forever 服务
有一个名为 “request-promise” 的 NPM,它使用了 NPM 里的 “request”。
举例来说,可以在 Express 中以以下方式使用。这个例子是在 GET /spike 的情况下访问 https://example.com/ 并返回其内容。
rp = require('request-promise');
app.get('/spike', (req, res) => {
rp({url: 'https://example.com', forever: true}).then((body) => res.send(body));
});
例如,如果我们使用 ab 等工具对其进行基准测试,添加 forever: true 和不添加 forever: true 将对性能产生显著影响。(注意:请勿真实访问 example.com 以避免对其造成困扰)
确认连接池是否已设置
netstat -nt | grep -c <target ip>:<443 or 80>
在这些地方可以查看与目标IP的TCP连接状态(数量)。
当没有进行连接池时,这个数量会随着时间增加。此外,会显示大量已结束连接的Connection的TIME_WAIT状态。
当使用 ConnectionPool 时,连接数大约会保持在并行数的范围内。可以看到处于 ESTABLISHED 状态的连接。
这有多大的效果?
只是作为参考,从大约每秒200个请求增加到大约每秒900个请求。
这取决于建立新连接的成本有多高。
利用 Node.js 的 http 模块所具备的功能。
总的来说,我没有好好尝试过。
即使在请求的 npm 上默认使用了这个选项,但当我尝试时却没有效果。
也许直接使用自带的http模块可以有效地工作。用这种方式来使用似乎是合适的。
var http = require('http');
var keepAliveAgent = new http.Agent({ keepAlive: true });
options.agent = keepAliveAgent;
http.request(options, onResponseCallback);
最后
最近,微服务之间的这种协作越来越多。调整API服务器端的keep-alive和连接池可以在性能上做出改善,所以我认为值得考虑。