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

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

github笔记说这关于池:

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

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

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

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); } }); 

高吞吐量/高性能的最佳select是什么?
高“maxSockets”号码有什么缺点?
我如何创build一个单独的池来使用,而不是全局池? 为什么我只想创build一个单独的池?

请求中的池选项使用与标准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. 把它作为假,将禁用池。
  3. 提供你自己的代理,就像上面的例子。

反过来回答你的问题。

池是为了保持一定数量的套接字被程序使用。 首先,套接字被重用于不同的请求。 所以它减less了创build新套接字的开销。 其次,它使用较less的套接字请求,但始终如一。 它不会占用所有可用的套接字。 第三,它维护请求队列。 所以有等待时间的暗示。

池像一个caching和一个节stream阀。 如果你有更多的请求和更小的套接字,节stream效果会更明显。 使用全局池时,可能会限制两个不同客户端的function,等待时间没有保证。 为他们分开游泳池将是更公平(认为如果一个请求比其他更多)。

maxSockets属性可以提供最大的并发性。 它增加了整体吞吐量/性能。 缺点是节stream效果降低。 你无法控制高峰开销。 将其设置为大量,将会像没有任何池塘一样。 你会开始得到错误,如套接字不可用。 它不能超过操作系统所允许的最大限制。

那么什么是最好的高吞吐量/性能? 吞吐量有物理限制。 如果达到极限,响应时间将随着连接数量的增加而增加。 到那时你可以继续增加maxSockets,但是在这之后增加它并不会有帮助。

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

通常,池是一个包含一些http代理的哈希对象。 它试图从“保持活动”连接重新使用创build的套接字。 每个主机:端口。 例如,您执行了多个请求来托pipewww.domain1.com:80和www.domain2.com:80,如果任何响应中不包含标头Connection: close ,则会将套接字放入缓冲池并将其提交给未决请求。

如果没有挂起的请求需要这个池的套接字,它将被销毁。

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

  • 根据那些热点请求访问,你最好创build单独的池。 所以新的请求可以非常快速地拾取空闲套接字。 问题是,您需要通过增加池的maxSockets值来减less对某些站点的挂起请求数。 请注意,当连接由源服务器通过响应头Connection: closepipe理良好时,如果将极高数字设置为maxSockets ,则maxSockets

  • 根据你的请求很难访问的那些网站,使用pool: false来禁用池。

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

 // create a separate socket pool with 10 concurrent sockets as max value. var separateReqPool = {maxSockets: 10}; var request = require('request'); request({url: 'http://localhost:8080/', pool: separateReqPool}, function(e, resp){ });