专栏首页Java架构沉思录一种单机支持 JavaWeb 容器万级并发的设想

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

本文作者:莫那鲁道
本文链接:https://www.cnblogs.com/stateis0/p/10963171.html

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

如下图:

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

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

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

答:有。

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

其实非常简单。

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

整个的调用流程如下图:

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

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

希望那一天快点到来。

本文分享自微信公众号 - Java架构沉思录(code-thinker)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!

    是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。

    黄泽杰
  • Java并行流Parallel Stream与Fork-Join线程池的关系,莫要乱用、滥用并行流

    在说stream之前,给大家分享一个数组匹配性能优化技巧,其实平时注意一些编码的优化,对整个系统的性能优化是有很大帮助的,积少成多。往往一个项目都是毁在一行行粗...

    黄泽杰
  • 说说Netty的线程模型

    最近发现极客时间的很多课程中,都穿插到了 Netty,可见 Netty 的重要性。基于此,给大家推荐一下这篇文章!

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

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

    江南一点雨
  • 将 async/await 异步代码转换为安全的不会死锁的同步代码

    发布于 2018-03-16 03:58 更新于 2018-08...

    walterlv
  • Java异步编程——深入源码分析FutureTask

    之前通过源码详细分析了ThreadPoolExecutor《你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识》。通过创建一个T...

    Zack说码
  • SAP最佳业务实践:SD–带质量管理的销售退货(237)-6退货库存处理

    一、MIGO退货库存转移至自有非限制库存 如果可重新使用退回的物料,则需要将其从退货库存移至非限制自有库存,这样退货可任意使用,并会重新包括在 MRP 计算之中...

    SAP最佳业务实践
  • 超强图文|并发编程【等待/通知机制】就是这个feel~

    现陆续将Demo代码和技术文章整理在一起 Github实践精选 ,方便大家阅读查看,本文同样收录在此,觉得不错,还请Star?

    用户4172423
  • R语言分析协变量之间的非线性关系

    最近我被问到我的 - [R和Stata的软件包是否能够适应协变量之间的非线性关系。答案是肯定的,在这篇文章中,我将说明如何做到这一点。

    拓端
  • 企业级内网环境搭建2万字详细教程

    简单说明:环境需要四台虚拟机,每一台分别充当企业内不同的功能分区,在真实环境中的配置还需视情况自行更改

    公众号爱国小白帽

扫码关注云+社区

领取腾讯云代金券