带你读《Apache Tomcat的云原生演进》——Tomcat的技术内幕和在喜马拉雅的实践(2)

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
函数计算FC,每月15万CU 3个月
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 带你读《Apache Tomcat的云原生演进》——Tomcat的技术内幕和在喜马拉雅的实践(2)

带你读《Apache Tomcat的云原生演进》——Tomcat的技术内幕和在喜马拉雅的实践(1)https://developer.aliyun.com/article/1377542


一般情况下,app发一个请求过来,你的包可能是完整的,但如果发一半过来,这个请求行可能是不完整的,这个时候它是不会阻塞的,它就会注册一个读事件读剩余的。读完请求行以后,它会继续解析头。解析头和解析行是一样的,也是不会阻塞。只需要配置好头的大小,它就会按照头的大小读。

 

因为Tomcat里有很多filterservlet,然后我们自己做了一些路由,去匹配filterservlet。一般我们这里处理完以后,我们就会去读它的body,但它和请求行、请求头不一样,它会阻塞。所以如果body不完整,比如content-length1000body只读到500,就会阻塞在Catalina work线程。这个时候它会通过增加一个wait,等到下次Poller线程来唤醒Catalina work线程。

 

image.png 

 

前面介绍了NIO模型主要分为三个部分Accept线程,Poller线程,Catalina work线程。

 

目前Tomcat已经支持了NIO2,它和NIO有一个很大的不同,中间没有Accept线程,Poller线程,它把NIO模式简化了。所以很多人说NIO2是异步的,但其实也不是,它只是基于自己的JDK实现epollAPI进行步模拟的。

 

NIO2在事件可读的时候会告诉操作系统,然后我这个时候就返回去做其他事情了。操作系统会把数据读到我的包里,然后告诉我可以用数据了,我就直接数据就行了。而NIO同步要发几个读,我需要自己触发操作系统去copy数据过来。然后我还需要在这里等着,等copy完了,再去把数据读出来,是会阻塞在这里的。

 

NIO2并不是真正的NIO,它的API使用机制模拟会告诉你读和写都完成了,所以整个模型是一个EPoller线程。它相当于直接操作EPoller wait,只要线程有事件来,它就会生成连接事件,读/写事件,他这里有一个队列,只要有事件就会一直读,不会说新建一个连接事件,我就处理读事件,它会把所有完整的事件先读出来。

 

读完以后就可以去处理了,如果是连接,我就执行accept这个操作,把连接读出来。接受连接不像NIO是单路线,有一个区别是,一般连接是有限制的,默认是1万。如果你是-1或者是没有限制的,accept就一直不会阻塞。如果是有限制,可能达到目标就会阻塞。

 

所以这个时候就会有两个不同的处理方式,如果是有限制的,不会用当前的Poller线程去做accept的操作,它会新提交一个任务到线程池里,让后面接着做accept的连接,因为不能阻塞Poller线程。

 

如果当时我是个读事件的话,我只要读出来就能提交给Catalina work线程,这个时候读是由Poller线程完成的。

 

假如我新建一个连接,做了三次握手,但是我不给你发数据。那么Poller线程就读不到数据,因此也就不会做处理。它只是注册一个事件到Poller线程,等数据来了再来读。还是和之前的不同,不会像NIO一样,刚开始肯定要去注册一个读事件。NIO2会直接读,一般很多的网络框架优化都是在这个地方做的。我是直接尝试读,不会去注册读事件。因为大部分情况下建立连接以后,后面就会发现不需要去做读事件的操作。因为你做一个读事件,这个读事件就会系统调用,就会涉及到上下文切换的开销

 

我一直在这里习惯用select,有事件就EPoll这个地方,没有就阻塞就EPoll这个地方。EPoller线程就是做这个事情。刚刚我们接触的连接它也是通过Catalina work线程,它们起来的时候可以添加一个accept task,就是先让你接受请求。

 

image.png

它和刚才说的读body一样,当body不够的时候,才会去注册一个事件到Epoller线程上去,它的读也是阻塞的。

 

NIOCatalina不一样的是,它只负责读和写,比NIO少了注册事件的操作。


带你读《Apache Tomcat的云原生演进》——Tomcat的技术内幕和在喜马拉雅的实践(3)https://developer.aliyun.com/article/1377540

目录
打赏
0
0
0
0
1023
分享
相关文章
云原生技术在现代企业中的应用与实践####
本文深入探讨了云原生技术的核心概念及其在现代企业IT架构转型中的关键作用,通过具体案例分析展示了云原生如何促进企业的敏捷开发、高效运维及成本优化。不同于传统摘要仅概述内容,本部分旨在激发读者对云原生领域的兴趣,强调其在加速数字化转型过程中的不可或缺性,为后续详细论述奠定基础。 ####
云原生时代的架构革新,Apache Doris 存算分离如何实现弹性与性能双重提升
随着云基础设施的成熟,Apache Doris 3.0 正式支持了存算分离全新模式。基于这一架构,能够实现更低成本、极致弹性以及负载隔离。本文将介绍存算分离架构及其优势,并通过导入性能、查询性能、资源成本的测试,直观展现存算分离架构下的性能表现,为读者提供具体场景下的使用参考。
云原生时代的架构革新,Apache Doris 存算分离如何实现弹性与性能双重提升
云栖实录 | 智能运维:云原生大规模集群GitOps实践
云栖实录 | 智能运维:云原生大规模集群GitOps实践
小米基于 Apache Paimon 的流式湖仓实践
本文整理自Flink Forward Asia 2024流式湖仓专场分享,由计算平台软件研发工程师钟宇江主讲。内容涵盖三部分:1)背景介绍,分析当前实时湖仓架构(如Flink + Talos + Iceberg)的痛点,包括高成本、复杂性和存储冗余;2)基于Paimon构建近实时数据湖仓,介绍其LSM存储结构及应用场景,如Partial-Update和Streaming Upsert,显著降低计算和存储成本,简化架构;3)未来展望,探讨Paimon在流计算中的进一步应用及自动化维护服务的建设。
小米基于 Apache Paimon 的流式湖仓实践
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
中信银行信用卡中心每日新增日志数据 140 亿条(80TB),全量归档日志量超 40PB,早期基于 Elasticsearch 构建的日志云平台,面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此使用 Apache Doris 替换 Elasticsearch,实现资源投入降低 50%、查询速度提升 2~4 倍,同时显著提高了运维效率。
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
Apache Tomcat 条件竞争文件上传漏洞(CVE-2024-50379)
Apache Tomcat 条件竞争文件上传漏洞(CVE-2024-50379)
智能运维:云原生大规模集群GitOps实践
智能运维:云原生大规模集群GitOps实践,由阿里云运维专家钟炯恩分享。内容涵盖云原生运维挑战、管理实践、GitOps实践及智能运维体系。通过OAM模型和GitOps优化方案,解决大规模集群的发布效率与稳定性问题,推动智能运维工程演进。适用于云原生环境下的高效运维管理。
邀您参加云原生高可用技术沙龙丨云上高可用体系构建:从理论到实践
云原生高可用技术专场,邀您从理论到实践一起交流,探索云上高可用体系构建!
103 14
杭州铭师堂的云原生升级实践
在短短 2-3 年间,杭州铭师堂完整经历了云计算应用的四个关键阶段:从“启动上云”到“全量上云”,再到“全栈用云”,最终达到“精益用云”。也从云计算的第一次浪潮,迈过了第二次浪潮,顺利的进入到了 第三次浪潮 AI + 云。
192 13

云原生

+关注

推荐镜像

更多