Tomcat 连接器如何工作?
How Tomcat connectors work?
假设您使用这样的(阻塞)BIO 连接器:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol" connectionTimeout="20000" redirectPort="8443" maxConnections="1000" maxThreads="200" />
你建立了 201 个并发连接,最后一个连接发生了什么?
如果您创建 1001 个并发连接,那么最后一个连接会怎样?
接下来让我们使用(非阻塞)NIO 连接器protocol="org.apache.coyote.http11.Http11NioProtocol"
201个和1001个并发连接会有区别吗?
据我了解,NIO 和 NIO2 之间没有行为差异,只是实现不同,这是真的吗?
当没有 APR/native 连接器可用时,Tomcat 8 使用默认协议设置 protocol="HTTP/1.1"
什么连接器?
------------编辑-------------
我做了一个像这样的小 servlet:
Thread.sleep(2000);
response.getWriter().write("ok");
设置这些设置 connectionTimeout="20000"
maxConnections="10"
maxThreads="2"
并发出 50 个并发请求。所有都将被接受,然后一次执行 2 个(当执行线程完成时)。即使 connectionTimeout="20000"
和 maxConnections="10"
.
也没有请求超时或出错
protocol="org.apache.coyote.http11.Http11NioProtocol"
和 protocol="org.apache.coyote.http11.Http11Protocol"
完全相同。我想当你有 Keep-Alive
个连接时,差异就会显现出来。 BIO 会在整个连接期间阻塞线程,NIO 会在每次请求后释放线程。
当我测试相同的场景但添加了参数 acceptCount="15"
时,正如 Dennis R 指出的那样,只有那时大多数请求才返回 org.apache.http.conn.HttpHostConnectException: Connection to http://localhost:8080 refused
。
------------编辑2------------
请注意,如果我设置此 maxConnections="100"
acceptCount="15"
那么所有 50 个连接都会被接受。
配置参数如下:Apache Tomcat 8 Configuration Reference
基本上有 Executor,标准实现中的队列默认长度是:
acceptCount=100
最大连接数是总共接受的连接数(在队列中和正在处理中)。
连接被拒绝,我假设基于首先到达的内容。
NIO 不受请求处理器线程的限制。
假设您使用这样的(阻塞)BIO 连接器:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol" connectionTimeout="20000" redirectPort="8443" maxConnections="1000" maxThreads="200" />
你建立了 201 个并发连接,最后一个连接发生了什么?
如果您创建 1001 个并发连接,那么最后一个连接会怎样?
接下来让我们使用(非阻塞)NIO 连接器protocol="org.apache.coyote.http11.Http11NioProtocol"
201个和1001个并发连接会有区别吗?
据我了解,NIO 和 NIO2 之间没有行为差异,只是实现不同,这是真的吗?
当没有 APR/native 连接器可用时,Tomcat 8 使用默认协议设置 protocol="HTTP/1.1"
什么连接器?
------------编辑-------------
我做了一个像这样的小 servlet:
Thread.sleep(2000);
response.getWriter().write("ok");
设置这些设置 connectionTimeout="20000"
maxConnections="10"
maxThreads="2"
并发出 50 个并发请求。所有都将被接受,然后一次执行 2 个(当执行线程完成时)。即使 connectionTimeout="20000"
和 maxConnections="10"
.
protocol="org.apache.coyote.http11.Http11NioProtocol"
和 protocol="org.apache.coyote.http11.Http11Protocol"
完全相同。我想当你有 Keep-Alive
个连接时,差异就会显现出来。 BIO 会在整个连接期间阻塞线程,NIO 会在每次请求后释放线程。
当我测试相同的场景但添加了参数 acceptCount="15"
时,正如 Dennis R 指出的那样,只有那时大多数请求才返回 org.apache.http.conn.HttpHostConnectException: Connection to http://localhost:8080 refused
。
------------编辑2------------
请注意,如果我设置此 maxConnections="100"
acceptCount="15"
那么所有 50 个连接都会被接受。
配置参数如下:Apache Tomcat 8 Configuration Reference 基本上有 Executor,标准实现中的队列默认长度是: acceptCount=100
最大连接数是总共接受的连接数(在队列中和正在处理中)。 连接被拒绝,我假设基于首先到达的内容。
NIO 不受请求处理器线程的限制。