我有一个net.Server
在 TCP 套接字上侦听旧系统的节点。当收到消息时,它会向另一个 http 服务器发送一个 http 请求。简化后,它看起来像这样:
var request = require('request-promise');
...
socket.on('readable', function () {
var msg = parse(socket.read());
var postOptions = {
uri: 'http://example.com/go',
method: 'POST',
json: msg,
headers: {
'Content-Type': 'application/json'
}
};
request(postOptions);
})
问题是套接字每秒可以读取大约 1000 次。然后这些请求使 http 服务器超载。几乎立即,我们得到了多秒的响应时间。
在运行 Apache 基准测试时,很明显,http 服务器可以在 100 毫秒的响应时间内每秒处理超过 1000 个请求 - 如果我们将并发请求的数量限制为大约 100 个。
所以我的问题是,当每个请求在事件回调中单独触发时,使用request-promise
(通过扩展,request
和)库限制未完成的并发请求的最佳方法是什么?core.http.request
请求的文档说:
请注意,如果您在循环中发送多个请求并创建多个新池对象,
maxSockets
则不会按预期工作。要解决此问题,请将 request.defaults 与您的池选项一起使用,或者使用maxSockets
循环外的属性创建池对象。
我很确定这一段告诉了我问题的答案,但我无法理解。我使用默认值来限制打开的套接字数量:
var rp = require('request-promise');
var request = rp.defaults({pool: {maxSockets: 50}});
这没有帮助。目前我唯一的想法是手动管理队列,但我认为如果我只知道常规的方法,那将是不必要的。