我正在使用Spring Boot和嵌入式Tomcat(8),在app.prop文件中我们有两个选择:
server.tomcat.max-connections = 1000
server.tomcat.max-threads= 20
从tomcat docs我已经读过,第一个选项是服务器可以支持的最大连接数,第二个选项是线程池中的最大线程数。在我了解之后,连接和请求与我想的不一样。之后我读了这个主题
What is the difference between thread per connection vs thread per request?
主题的要点是:
Thread per request will create a thread for each HTTP Request the server receives
Thread per connection will reuse the same HTTP Connection from multiple requests
在单词reuse the same HTTP Connection
之后,我检查了Http keep-alive。
概念:响应服务器和客户端之后无法关闭连接。
但怎么可能呢?我的意思是当我向服务器发送请求时,来自线程池的一个线程将接收我的请求然后发送我的请求,之后根据Http keep-alive
我的连接未关闭。在哪里存储,当我发送另一个请求时会发生什么,同一个线程是否会处理我的请求?
答案 0 :(得分:0)
存储在哪里,
这是一个实现细节 - 对于在Tomcat之上开发应用程序并不重要。您必须为此查找Tomcat的源代码,但我认为这完全没必要。除非你想进入tomcat开发,否则它不会教你任何东西。仅适用于应用:忽略它。
当我发送另一个请求时会发生什么,
它将被处理。周期。
同一个线程处理我的请求吗?
不。或者:随机是的。任何当前可以自由处理请求的线程都将用于处理此请求。
您的问题暗示了一些危险的期望:除了request
和response
中封装的当前状态的所有之外,您不得假设请求处理中的任何内容。被处理到servlet中的对象。没有其他假设 - 实际上,任何其他假设(例如关于线程,servlet的成员变量)通常是错误的。
容器(tomcat)可以很好地将应用程序与那些低级别的细节隔离开来。不要去那里弄乱它。除了在request
和response
对象中找到的内容之外,您不能假设处理一个请求与下一个请求之间存在任何一致性。
答案 1 :(得分:0)
所以这个问题是我3年前发布的。我当时不了解的主要内容是线程数量与连接数量有何不同。对于Java初学者来说,这确实令人困惑,因为Java在用户级别线程之上提供了抽象,并且不清楚在这种情况下什么是连接。
因此,对于基于Unix的系统,连接数量是服务器可以同时打开的文件描述符的总数。假设连接数量为100,线程数量为10。这意味着,当用户向服务器发送请求时,服务器会为此请求创建文件描述符,如果所有Tomcat的线程都处于繁忙状态,则该文件描述符将在一个线程后立即处理将可用。为了打开多个文件描述符,Tomcat(8+)使用了基于事件循环的NIO连接器。这里的主要要点是tomcat有一个(此数字是可配置的)线程,该线程正在侦听传入的请求,创建关联的文件描述符,并在服务器完成处理后,使用文件描述符将该响应发送给客户端。
顺便说一句,Nodejs是这样工作的,如果您有兴趣的话,我写了一篇关于它的博客文章https://strogiyotec.github.io/pages/posts/io.html