如何使用Request js(Node js Module)池

时间:2013-09-27 05:34:42

标签: node.js

有人可以解释如何使用request.js池哈希吗?

github notes说出有关游泳池的信息:

  

pool - 包含这些请求的代理的哈希对象。如果省略这个   请求将使用设置为节点的默认maxSockets的全局池。

     

pool.maxSockets - 包含池中最大套接字数量的整数。

我有这个代码用于写入CouchDB实例(注意问号)。基本上,连接到我的节点服务器的任何用户都将相互独立地写入DB:

var request = require('request');

request({
    //pool:,     //  ??????????????????
    'pool.maxSockets' : 100,  //  ??????????????????
    'method' : 'PUT',
    'timeout' : 4000,
    'strictSSL' : true,
    'auth' : {
        'username' : myUsername,
        'password' : myPassword
    },
    'headers' : {
        'Content-Type': 'application/json;charset=utf-8',
        'Content-Length': myData.length
    },
    'json' : myData,
    'url': myURL
}, function (error, response, body){
    if (error == null) {
        log('Success: ' + body);
    }
    else {
        log('Error: ' + error);
    }
});

什么是最佳的高吞吐量/性能?
高'maxSockets'号码有什么缺点?
如何创建单独的池而不是全局池?为什么我只想创建一个单独的池?

2 个答案:

答案 0 :(得分:43)

请求中的池选项使用与标准http库中的http.Agent相同的代理。请参阅http.Agent的文档,并查看http.request中的agent选项。

用法

pool = new http.Agent(); //Your pool/agent
http.request({hostname:'localhost', port:80, path:'/', agent:pool});
request({url:"http://www.google.com", pool:pool });

如果您想知道什么是可以从控制台看到的。

{ domain: null,
  _events: { free: [Function] },
  _maxListeners: 10,
  options: {},
  requests: {},
  sockets: {},
  maxSockets: 5,
  createConnection: [Function] }

maxSockets确定代理可以为每个主机打开多少并发套接字,默认情况下在代理中存在值为5.通常,您可以在之前设置它。明确传递pool.maxSockets将覆盖pool中的maxSockets属性。只有通过pool选项时,此选项才有意义。

使用它的方式不同:

  1. 不提供agent选项,undefined将使用http.globalAgent。默认情况。
  2. 将其设为false,将禁用池化。
  3. 提供您自己的代理,如上例所示。
  4. 反过来回答你的问题。

    池旨在保留程序使用的特定数量的套接字。首先,套接字被重用于不同的请求。因此,它减少了创建新套接字的开销。其次,它使用较少的套接字来处理请求,但始终如一。它不会占用所有可用的插座。第三,它维护请求队列。所以有等待时间暗示。

    池就像缓存和限制一样。如果您有更多请求和更少的套接字,则油门效果将更加明显。使用全局池时,它可能会限制两个不同客户端的运行,无法保证等待时间。为他们建立单独的游泳池对两者都更公平(想想如果有人要求更多)。

    maxSockets属性可以提供最大的并发性。它提高了整体吞吐量/性能。缺点是油门效应降低。您无法控制峰值开销。将它设置为大数字,就像没有汇集一样。你会开始得到像socket不可用的错误。它不能超过操作系统设置的允许最大限制。

    那么什么是最佳的高吞吐量/性能?吞吐量存在物理限制。如果达到限制,响应时间将随连接数增加。你可以继续增加maxSockets直到那时,但在那之后增加它将无济于事。

答案 1 :(得分:13)

您应该查看forever-agent模块,它是http.Agent的包装。

通常,池是一个包含许多http代理的哈希对象。它试图从“keep-alive”连接中重用已创建的套接字。每个主机:端口。例如,您执行了多个请求来托管www.domain1.com:80和www.domain2.com:80,如果任何响应不包含标头Connection: close,它会将套接字放入池中并将其置于待处理状态请求。

如果没有待处理的请求需要这个池化套接字,它将被销毁。

maxSockets表示单个主机的最大并发套接字:端口,默认值为 5 。我建议你一起考虑这个价值:

  • 根据那些热门网站请求访问,你最好创建单独的池。这样新的请求可以非常快速地获取空闲套接字。关键是,您需要通过增加池的maxSockets值来减少对某些站点的待处理请求数。请注意,如果原始服务器通过响应头maxSockets妥善管理连接,则将{1}设置为非常高的数字无关紧要。

  • 根据您的请求几乎无法访问的网站,请使用Connection: close禁用池。

您可以使用这种方式为您的请求指定单独的池:

pool: false