如果你想要从Node.js向HTTP服务器发送通信,可以使用ConnectionPool

首先

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

プレゼンテーション1.png

版本

    • nodejs: v4.2.3

 

    • npm

request: 2.67.0
request-promise: 1.0.2

ConnectionPool的方法

看起来有几种方法可供选择。

    1. 请使用 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和连接池可以在性能上做出改善,所以我认为值得考虑。

广告
将在 10 秒后关闭
bannerAds