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

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
注册配置 MSE Nacos/ZooKeeper,118元/月
函数计算FC,每月15万CU 3个月
简介: 带你读《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

相关文章
|
6天前
|
Cloud Native 持续交付 API
探索云原生技术:打造未来应用的基石
【9月更文挑战第29天】在数字时代的浪潮中,云原生技术如星辰般熠熠生辉。它不仅仅是一套工具或框架,而是一种全新的应用开发与部署哲学。本文将深入探讨云原生的核心理念、关键技术以及它们如何共同作用于现代软件架构之中,为读者呈现一场技术与创新的盛宴。
|
8天前
|
Cloud Native 安全 持续交付
云原生技术在现代企业中的应用与挑战
本文探讨了云原生技术在现代企业中的重要性及其应用,分析了其在提升业务敏捷性、扩展性和成本效益方面的显著优势。同时,文章也讨论了企业在实施云原生架构时面临的主要挑战,包括文化转变、技能短缺和安全性问题,并提出了相应的解决策略。通过深入分析和实际案例研究,本文旨在为企业在云原生旅程中提供指导和见解。
|
6天前
|
运维 Cloud Native 持续交付
云原生技术:构建未来应用的基石
在当今这个数字化时代,云原生技术正迅速成为推动企业创新和数字化转型的关键力量。本文将深入探讨云原生的核心概念、主要特点以及它如何改变我们构建、部署和运行应用程序的方式。通过分析Kubernetes、微服务、容器化等关键技术,本文旨在为读者提供一个关于云原生技术的全面理解,并探讨其在未来软件开发领域的重要性。
|
1天前
|
Kubernetes Cloud Native 持续交付
云原生技术入门及应用实例
【9月更文挑战第34天】云原生,这个词汇在IT界已经越来越热。它代表的是一种构建和运行应用程序的方法,旨在充分利用云计算的优势。本文将从云原生的基本概念入手,深入探讨其核心技术和应用场景,最后通过一个简单的代码示例,带你走进云原生的世界。
|
2天前
|
运维 Cloud Native 云计算
探索云原生技术的未来之路
【9月更文挑战第33天】本文将深入探讨云原生技术及其未来发展方向。我们将从云原生的基本概念出发,逐步剖析其核心组件、架构优势以及在现代企业中的实际应用。文章还将通过代码示例,展示如何利用云原生技术构建高效、可扩展的应用程序。最后,我们将展望云原生技术的未来趋势,并讨论其对行业的潜在影响。
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
4天前
|
Cloud Native 测试技术 云计算
云原生技术在现代应用开发中的角色与实践
【9月更文挑战第31天】本文深入探讨了云原生技术如何革新现代应用开发流程,通过实际案例分析,揭示了其对提高开发效率、确保系统可扩展性和可靠性的显著影响。文章不仅介绍了云原生的核心概念,还提供了实施策略和最佳实践,旨在为开发者提供一条清晰的云原生转型之路。
|
4天前
|
运维 Cloud Native 持续交付
探索云原生技术:构建高效、可扩展的现代应用
在当今数字化时代,云原生技术正迅速改变着企业构建和运行应用程序的方式。本文深入探讨了云原生技术的基本原理、核心组件及其带来的优势,揭示了如何通过采用云原生架构来提升应用的敏捷性、弹性和可扩展性。无论是开发者、运维人员还是企业决策者,了解并掌握云原生技术都将成为推动业务创新和保持竞争力的关键。
|
3天前
|
运维 Cloud Native Devops
探索云原生技术:企业数字化转型的新引擎###
在当今数字化浪潮中,云原生技术以其敏捷性、弹性和松耦合性,成为推动企业创新与效率的关键因素。本文将深入探讨云原生的核心概念、关键技术组件及其在不同行业中的应用实践,揭示其如何助力企业快速适应市场变化,实现高效运营与持续创新。 ###
|
1天前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes的奇妙之旅
【9月更文挑战第34天】在数字化浪潮中,云原生技术如Kubernetes已经成为IT行业的重要力量。本文旨在通过浅显易懂的方式,向初学者揭示Kubernetes的核心概念、架构设计及其在实际业务中的应用价值,帮助读者快速理解并掌握这一技术,为进一步深入学习和实践打下坚实基础。
7 1