当前位置: 首页 > 面试题库 >

如何使用请求js(节点js模块)池

柴英光
2023-03-14
问题内容

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

在github上的注释说,这大约池:

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

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

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

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’数量高的缺点是什么?
如何创建单独的池而不是全局池?为什么只想创建一个单独的池?


问题答案:

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

用法

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显式传递将覆盖中的maxSockets属性pool。仅当通过pool选项时,此选项才有意义。

如此不同的使用方式:

  1. 不提供agent选项,undefined将使用http.globalAgent。默认情况。
  2. 将其设置为false,将禁用池化。
  3. 提供您自己的代理,例如上面的示例

反向回答您的问题。

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

池就像缓存和节流阀。如果您有更多的请求和更少的套接字,则油门效果将更加明显。使用全局池时,它可能会限制两个不同客户端的功能,因此无法保证等待时间。为他们拥有单独的资源池对两者都比较公平(请考虑一下,如果一个请求比另一个请求更多)。

maxSockets属性可提供最大的并发性。它提高了整体吞吐量/性能。缺点是油门效果降低。您无法控制峰值开销。将其设置为大数,就像根本没有池。您将开始遇到诸如套接字不可用之类的错误。它不能超过操作系统设置的允许的最大限制。

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



 类似资料:
  • 我用请求模块和异步模块的组合并行爬行了很多链接 我注意到很多和错误,尽管使用chrome可以访问链接并快速响应。 在请求选项中,我将限制为2,将限制为10000。我使用限制为2的来减少每次请求的并行性。所以我有2套接字,2个请求和10秒的超时时间来等待来自服务器的头响应,但我得到了这些错误。 在这里s我使用的请求配置: 以下是我用来生成链接的代码片段: 我听了错误事件,我看到每当错误代码为时,co

  • 我有如下代码: 我如何设置标题?我需要用户代理、内容类型,可能还有其他一些东西在标题中: 我尝试了多种方法,但我可以发送标题或表单数据,但未能同时发送这两种数据。

  • 我正在尝试在后端节点中发出http请求。js web app。我可以在前端web javascript文件上发出成功的完整http请求,如下所示: 并遵循本指南:https://nodejs.dev/learn/make-an-http-post-request-using-nodejs 我一直试图在node中发出相同的请求。js后端: 但运行上述请求会导致以下错误: 我设置url/path设置的

  • 我正在使用谷歌云视觉检测图像上的文本。这种方法在80%的情况下有效。另外20%,我得到了这个错误: 当我在谷歌上搜索这个问题时,似乎我需要发送特定的标题和我的请求来解决这个问题,基本上就像这里指定的:https://cloud.google.com/vision/docs/ocr#specify_the_language_optional 但是,我不知道如何用我正在使用的Node.js代码发送这些

  • 我正在用nodejs和MongoDB创建我的第一个API,我想创建一个类似“localhost:3050/user/name”的GET请求。所以我建立了这个: ...

  • 我在循环中的节点JS中发送这样的GET请求 由于响应是异步的,是否可以在响应中获取原始请求URL? 谢谢!