【问题标题】:How Tomcat connectors work?Tomcat 连接器如何工作?
【发布时间】:2021-09-29 18:21:19
【问题描述】:

假设您使用这样的(阻塞)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/本机连接器时,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 个连接都被接受。

【问题讨论】:

    标签: java tomcat tomcat8 connector


    【解决方案1】:

    这里是配置参数:Apache Tomcat 8 Configuration Reference 基本上有Executor,标准实现中的队列默认长度是: 接受计数=100

    最大连接数是总共接受的连接数(在队列中和正在处理中)。 连接被拒绝,我假设基于首先到达的任何内容。

    NIO 不受请求处理器线程的限制。

    这里很好summary/comparison

    【讨论】:

    • linuxfoundation 网站上的总结/比较链接已损坏。
    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2021-08-16
    • 2021-03-01
    相关资源
    最近更新 更多