2

我有一个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}});

这没有帮助。目前我唯一的想法是手动管理队列,但我认为如果我只知道常规的方法,那将是不必要的。

4

1 回答 1

0

那么你需要限制你的请求吗?我有两种解决方法,但让我向您展示我一直使用的一种模式。我经常使用throttle-execandPromiserequest. 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)

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

于 2016-01-18T04:22:09.290 回答