为什么Tomcat的NIO在读取body时要模拟阻塞?

文章首发地址

Tomcat的NIO完全可以以非阻塞方式处理IO,为什么在读取body部分时要模拟阻塞呢?在Tomcat的NIO读取HTTP请求时,为了保证请求的正确性和可靠性,需要模拟阻塞模式,这是因为servlet规范里定义了ServletInputStream在读数据时是阻塞模式。

ServletInputStream在读取数据时是阻塞模式,是因为Servlet容器需要保证请求的完整性和顺序性。在HTTP协议中,请求分为请求头和请求体两部分,其中请求体可能会比较长。如果ServletInputStream是非阻塞的,那么在读取请求体时,会出现部分数据读取到了,部分数据没有读取到的情况,这样会导致请求的不完整,可能会影响后续的业务处理。

另外,Servlet容器需要保证请求的顺序性,即先到先处理。如果ServletInputStream是非阻塞的,那么在读取请求体时,可能会出现多个请求的数据混淆在一起的情况,这样会导致请求的顺序被打乱,可能会影响后续的业务处理。

因此,为了保证请求的完整性和顺序性,Servlet规范规定ServletInputStream在读取数据时必须是阻塞模式。

具体来说,Tomcat的NIO会将读取请求体的过程分为多个步骤,每次读取一部分数据,然后判断是否已经读取完整个请求体,如果没有则等待一段时间再继续读取。这种方式可以有效保证请求的正确性和可靠性,同时也避免了使用阻塞模式可能带来的性能问题。

相关推荐
Félix25114 分钟前
Nacos学习笔记(SpringBoot/SpringCloud)
java·spring boot·spring
文丑颜不良啊19 分钟前
LeetCode1581~1600题目解析
java·leetcode
香蕉大香蕉(06敬畏市场)19 分钟前
MySQL 单点详解(06)
java·数据库·mysql·博客·实习
lqbzlll32 分钟前
Spring Boot 开启虚拟线程后接口反而变慢了?4 个排查方向和对应修法
java·spring boot·后端
七夜zippoe37 分钟前
LangChain4j vs Spring AI:Java AI 框架怎么选(对比表)
java·人工智能·spring·ai·langchain4j
悠仁さん42 分钟前
【C++】set map 使用
java·前端·c++
yuniko-n1 小时前
【JUC】Thread 内存泄露
java
freejackman1 小时前
【架构篇】双遍历 + 多栈协同:手撸 SQL 血缘引擎的架构思考
java·大数据·数据库·hive·sql·架构·spark
企业数字化笔记1 小时前
业务单据怎样接入流程中心?启动条件、实例关联与失败回退
java·spring boot·mysql
挖掘狂人1 小时前
同一个端口能不能被两个程序同时监听?
java·后端·程序员