因此,我正在尝试优化节点应用程序,并且我的应用程序发出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进行开发之前,我问过类似的问题,似乎一个客户端/一个应用程序是非常有效的模式。