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

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

以下图:sql

因而出现了类 Netty 的 Reactor 线程模型。同时,Java 官方也设计了 Servlet 3 异步 API,能够经过返回类 Feature 的方式,实现异步编程。在某些状况下,也能够实现万级别并发。数据库

Servlet 3

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

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

答:有。服务器

异步编程是提升生产力的关键。下图是咱们今天假设的模型:并发

新的设想模型

其实很是简单。异步

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

整个的调用流程以下图:高并发

新的调用流程设想

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

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

但愿那一天快点到来。

相关文章
相关标签/搜索