我有一个节点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
)库来限制未完成的并发请求的最佳方法是什么?在事件回调中?
请求documentation说:
请注意,如果您在循环中发送多个请求并创建多个新池对象,
maxSockets
将无法按预期工作。要解决此问题,请将request.defaults与池选项一起使用,或者在循环外部创建具有maxSockets
属性的池对象。
我很确定这段话告诉我问题的答案,但我无法理解。我使用默认值来限制套接字打开的数量:
var rp = require('request-promise');
var request = rp.defaults({pool: {maxSockets: 50}});
哪个没用。我目前唯一的想法是手动管理一个队列,但如果我只知道传统的方法,我认为这是不必要的。
答案 0 :(得分:0)
嗯,你需要限制你的请求吗?我以两种方式解决了这个问题,但是让我向您展示我总是使用的一个模式。我经常使用throttle-exec
和Promise
为request
制作包装器。您可以使用npm install throttle-exec
安装它并使用Promise本机或第三方。这是我对这个包装器https://gist.github.com/ans-4175/d7faec67dc6374803bbc
你如何使用它?它很简单,就像普通的请求一样。
var Request = require("./Request")
Request({
url:url_endpoint,
json:param,
method:'POST'
})
.then(function(result){
console.log(result)
})
.catch(reject)
实施后告诉我。无论哪种方式,我有另一个包装:)