一种单机支持 JavaWeb 容器万级并发的设想

2年前 (2022) 程序员胖胖胖虎阿
200 0 0

一种单机支持 JavaWeb 容器万级并发的设想

本文作者:莫那鲁道

本文链接:http://1t.click/a87c

高并发对于大部分小伙伴来说,可能工作中并不容易遇到,但是在面试时候这是一个非常高频的问题。松哥之前从数据库优化的角度写过一篇文章来简单聊过这个问题:

  • 给数据库减负的八个思路

最近又看到有别的小伙伴写的一篇,感觉很有意思,和小伙伴们分享下,权当开阔眼界。内容如下。

当前的大部分 Java web 容器基于 Bio 线程模型,例如常见的 Tomcat ,默认 200 线程,即 200 连接。由此带来的问题是,如果想提高并发,或者提高资源利用率,就得加大线程数。

如下图:

一种单机支持 JavaWeb 容器万级并发的设想

于是出现了类 Netty 的 Reactor 线程模型。同时,Java 官方也设计了 Servlet 3 异步 API,可以通过返回类 Feature 的方式,实现异步编程。在某些情况下,也可以实现万级别并发。

一种单机支持 JavaWeb 容器万级并发的设想

但是,为什么 Java 社区的异步编程无法推广开来?究其原因,数据库是罪魁祸首,再往上看,其实是 JDBC 的锅,JDBC 定义了一套阻塞式的数据库 IO 通信模型。这导致每次请求,线程都阻塞在等待 DB 结果。进而导致,服务器资源无法充分利用。

有没有一种办法,让 Java web 应用的整个链路都是非阻塞的呢?

答:有。

异步编程是提高生产力的关键。下图是我们今天假设的模型:

一种单机支持 JavaWeb 容器万级并发的设想

其实非常简单。

我们让 Tomcat 支持 Servlet 3 异步编程模型,接口返回 feature 即可,这个功能其实有很多web 容器都实现了。关键的是,我们让 DB 客户端和服务器都支持异步编程模型。让 DB 像 netty 复用 IO 连接,业务线程只需要将 SQL 交给数据库 client 即可返回 feature,然后释放当前线程(再也不用阻塞,这是关键),等 DB 操作结果返回时,只需通知这个 feature 即可。这将极大的提高线程的利用率,不夸张的说,只需 8 条线程,就足以承受万级别的并发。

整个的调用流程如下图:

一种单机支持 JavaWeb 容器万级并发的设想

我们看到,当一个 http 请求过来,整个流程是无阻塞的,不用等待 数据库 返回结果,业务只需添加回调即可,当数据库结果返回时,自动触发回调。

当然,这只是我的一个小设想,Mysql 要重写连接器,我估计是太难了。但是,那些新一代的数据库,是否能够把连接器设计成支持异步、支持多路复用的呢?这样,web 应用的客户端,就能够把整个链路设计成异步的,这将节约很多资源,提高生产力。

希望那一天快点到来。

一种单机支持 JavaWeb 容器万级并发的设想
一种单机支持 JavaWeb 容器万级并发的设想


1、前后端分离开发中动态菜单的两种实现方案

2、Spring Security 前后端分离登录,非法请求直接返回 JSON

3、使用 Nginx 部署前后端分离项目,解决跨域问题

4、喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了

5、Spring Boot 整合 OAuth2,松哥手把手教你!

6、一个小小的里程碑!啥也不说了,签名书奉上!

7、七个开源的 Spring Boot 前后端分离项目,一定要收藏!

8、一键部署 Spring Boot 到远程 Docker 容器,就是这么秀

9、40 篇原创干货,带你进入 Spring Boot 殿堂!

一种单机支持 JavaWeb 容器万级并发的设想

喜欢就点个"在看"呗^_^

本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

版权声明:程序员胖胖胖虎阿 发表于 2022年9月4日 上午12:48。
转载请注明:一种单机支持 JavaWeb 容器万级并发的设想 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...