有人可以解释如何使用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'号码有什么缺点?
如何创建单独的池而不是全局池?为什么我只想创建一个单独的池?
答案 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
选项时,此选项才有意义。
使用它的方式不同:
agent
选项,undefined
将使用http.globalAgent
。默认情况。反过来回答你的问题。
池旨在保留程序使用的特定数量的套接字。首先,套接字被重用于不同的请求。因此,它减少了创建新套接字的开销。其次,它使用较少的套接字来处理请求,但始终如一。它不会占用所有可用的插座。第三,它维护请求队列。所以有等待时间暗示。
池就像缓存和限制一样。如果您有更多请求和更少的套接字,则油门效果将更加明显。使用全局池时,它可能会限制两个不同客户端的运行,无法保证等待时间。为他们建立单独的游泳池对两者都更公平(想想如果有人要求更多)。
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