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

Node.js最大套接字池设置

温亮
2023-03-14
问题内容

因此,我正在尝试优化节点应用程序,并且我的应用程序发出HTTP和HTTPS请求。

从LinkedIn的这篇文章中可以使节点变得更快,它建议禁用套接字池以消除5个套接字的限制:

// Disable socket pooling
var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)

现在来自GitHub上的Mikeal(Request的开发者),他建议:

require('http').globalAgent.maxSockets = Infinity

公平地说,他不建议无限,但您可以在其中加上任何合理的值。

现在,我的应用程序使用http和https,因此我使用了以下代码:

var http = require('http');
http.globalAgent.maxSockets = 30;
var https = require('https');
https.globalAgent.maxSockets = 30;

当我这样做时,出现以下错误:

TypeError:无法设置未定义的属性“ maxSockets”

最后,在查看HTTP文档时,它不会显示“
globalAgent”,而仅显示agent.maxSockets。

因此,我首先想知道,重写此参数的最佳语法是什么?

第二,最优值是多少?它基于服务器的内存量吗?它的带宽?


问题答案:

至于TypeError您得到的,设置http.globalAgent.maxSockets或时我没有任何错误https.globalAgent.maxSockets。您的应用中还有其他情况。

关于问题的第一部分,请意识到您不仅限于使用全局代理。您可以创建自己的Agent实例,并使用该实例发出请求:

var http = require('http');
var myAgent = new http.Agent();

http.request({ ... , agent: myAgent }, ...);

使用自定义代理程序发出的请求根本不会与全局代理程序进行交互。如果您没有显式指定一个代理或选择不一起使用代理(通过在request选项中false作为agent值传递),则全局代理只是使用的默认代理。

因此,当文档说时agent.maxSockets,他们实际上是在指通用Agent类。每个实例都具有该属性,包括全局代理(默认代理),您 必须
通过该属性进行访问http.globalAgent

问题的第二部分(最佳maxSockets)很难回答。请记住,许多服务器将限制来自给定IP的并发连接的数量,并且您要确保不会让大量并发请求的服务器不堪重负。(随着一次触发足够多的请求,您实质上是在DOS服务器。)



 类似资料:
  • 在OkHttp中,我找不到设置硬最大连接池大小的方法。从留档https://square.github.io/okhttp/3.x/okhttp/okhttp3/ConnectionPool.html很明显,您可以设置最大空闲连接,但不能设置整体最大值。这意味着在高负载下,它可以增长超过任何限制。 有没有办法最大化池?如果没有,为什么没有?

  • 问题内容: Windows下java中的最大套接字数是多少?我该如何更改? 问题答案: 这在很大程度上取决于为操作系统配置的最大文件描述符(Windows中的句柄)数量。每个打开的文件或套接字使用一个文件描述符。例如,在Solaris中,max fd的默认值为65536。可能会有使用FD池的其他文件,因此限制了套接字的上限,除非操作系统经过调整以增加FD的数量 在Windows NT / 2000

  • 我使用的是SpringBoot2.0。3释放。我想增加HikariCP的最大池大小,默认情况下为10。 我试着在带有 spring.datasource.hikari.maximum-池-大小=200 但是它不起作用,因为在日志中它仍然显示最大池大小为10。 我想改变的原因是,我不知怎么地达到了登台的极限,我不知道是什么原因造成的。

  • 嘿,我正在使用Glassfish开源v4,我遇到了一个奇怪的问题。 我在管理控制台中定义了到Oracle 11g的JDBC连接池,并设置了: 初始和最小池大小:500 最大游泳池大小:1000 池大小调整数量::750 我已经为这个连接池创建了一个特定的用户。然而,有时当我检查数据库中打开的连接时,我发现有1000多个连接(我看到的最大连接数是1440个) 当发生这种情况时,任何查询尝试都会失败,

  • 问题内容: Node.js异步I / O是否需要Redis连接池? 我看到的大多数Redis库都允许您创建客户端连接,但是连接池模块并不多,因此我认为它并不那么重要。 令我困惑的一件事是,Redis在一个Redis实例中默认具有16个不同/分段的数据库。 因此,如果创建一个连接池,则连接到16个数据库中的哪个数据库?您可以使用同一连接池一次连接所有16个吗? 是否存在一个Node.js Redis

  • 问题内容: 在Redis上使用node_redis Node.js模块时,我应该只使用一个连接,因为Redis是单线程进程,还是应该创建一个连接池来提高性能? 问题答案: 只需使用一个连接。这两个节点和Redis的是 有效的 单个线程。我认为拥有多个连接不会给您带来任何好处。在开始使用Redis进行开发之前,我问过类似的问题,似乎一个客户端/一个应用程序是非常有效的模式。