限制事件驱动的Nodejs HTTP请求

时间:2015-07-02 16:53:14

标签: node.js http httprequest node-request

我有一个节点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(扩展名为requestcore.http.request)库来限制未完成的并发请求的最佳方法是什么?在事件回调中?

请求documentation说:

  

请注意,如果您在循环中发送多个请求并创建多个新池对象,maxSockets将无法按预期工作。要解决此问题,请将request.defaults与池选项一起使用,或者在循环外部创建具有maxSockets属性的池对象。

我很确定这段话告诉我问题的答案,但我无法理解。我使用默认值来限制套接字打开的数量:

var rp = require('request-promise');
var request = rp.defaults({pool: {maxSockets: 50}});

哪个没用。我目前唯一的想法是手动管理一个队列,但如果我只知道传统的方法,我认为这是不必要的。

1 个答案:

答案 0 :(得分:0)

嗯,你需要限制你的请求吗?我以两种方式解决了这个问题,但是让我向您展示我总是使用的一个模式。我经常使用throttle-execPromiserequest制作包装器。您可以使用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)

实施后告诉我。无论哪种方式,我有另一个包装:)