当前的大部分 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 应用的客户端,就能够把整个链路设计成异步的,这将节约很多资源,提高生产力。

希望那一天快点到来。

一种单机支持 JavaWeb 容器万级并发的设想的更多相关文章

  1. 知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路

    本文来自知乎官方技术团队的“知乎技术专栏”,感谢原作者陈鹏的无私分享. 1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动 ...

  2. [转帖]当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题?

    改天学习一下. https://www.cnblogs.com/alisystemsoftware/p/11570806.html   当 K8s 集群达到万级规模,阿里巴巴如何解决系统各组件性能问题 ...

  3. 万级K8s集群背后etcd稳定性及性能优化实践

    背景与挑战 随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...

  4. 万级K8s集群背后 etcd 稳定性及性能优化实践

    1背景与挑战随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...

  5. Netty 100万级到亿级流量 高并发 仿微信 IM后台 开源项目实战

    目录 写在前面 亿级流量IM的应用场景 十万级 单体IM 系统 高并发分布式IM系统架构 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -10[ 博客园 总入口 ] 写在前面 ​ 大家好 ...

  6. 万级TPS亿级流水-中台账户系统架构设计

    万级TPS亿级流水-中台账户系统架构设计 标签:高并发 万级TPS 亿级流水 账户系统 背景 业务模型 应用层设计 数据层设计 日切对账 背景 我们需要给所有前台业务提供统一的账户系统,用来支撑所有前 ...

  7. 两种“新型”的javaweb后门(jspx和Java Logger)

    利用这个可以突破st2下   强制jsp跳转login.jsp 利用jspx解决jsp后缀被限制拿shell - Hack Blog | 黑客博客http://www.hackblog.cn/post ...

  8. JAVA Apache POI 之sax 解析10万级大数量数据

    第一步让我们来看看我们的大量数据的excel 文件 好的下面第二步看一下代码: package com.chinait.utils; /** * 写这个东西主要是最近做了一个联通的数据迁移工作,他们就 ...

  9. 备战双 11!蚂蚁金服万级规模 K8s 集群管理系统如何设计?

    作者 | 蚂蚁金服技术专家 沧漠 关注『阿里巴巴云原生』公众号,回复关键词"1024",可获取本文 PPT. 前言 Kubernetes 以其超前的设计理念和优秀的技术架构,在容器 ...

随机推荐

  1. matlab中的colormap

    matlab colormaps 默认颜色图是 parula ,颜色图从左往右数值不断增大. 颜色图名称 色阶 parula jet hsv hot cool spring summer autumn ...

  2. 最热门的 10 个 Java 微服务框架

    1.Spring Boot Java 构建 Spring 应用程序已经有很长一段时间了,Spring Boot 是 Spring 的一个特定版本,它通过对配置细节的处理,使微服务构建更加简便.创建 S ...

  3. IT兄弟连 Java语法教程 逻辑运算符

    表8中显示的布尔逻辑运算符只能操作布尔类型的操作数,所有的二元逻辑运算符都可以组合两个布尔值,得到的结果为布尔类型. 表8  布尔逻辑运算符 布尔逻辑运算符”&“.”|“以及”^“,都会布尔值 ...

  4. Pycharm快捷键集合

    运行类:Alt + Shift + F10 运行模式配置Alt + Shift + F9 调试模式配置Shift + F10 运行Shift + F9 调试Ctrl + Shift + F10 运行编 ...

  5. SparkStreaming 整合kafka Demo

    这里使用的是低级API,因为高级API非常不好用,需要繁琐的配置,也不够自动化,却和低级API的效果一样,所以这里以低级API做演示 你得有zookeeper和kafka 我这里是3台节点主机 架构图 ...

  6. Saltstack_使用指南10_配置管理-状态模块

    1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...

  7. 重温《NoSQL精粹》

    前言 在网上有关Redis相关文章满天飞的时候,它是什么,用于解决什么问题,有哪些相类似的技术,与传统的关系型数据库有哪些差别,什么时候使用?这个时候我决定重温一下<NoSQL精粹>. 也 ...

  8. https://jwt.io/一个可以解析token的神奇网站

    网址:https://jwt.io/ 效果:

  9. [Go] 写文件和判断文件是否存在

    OpenFile得到一个File,然后调用它的Write,参数是字节切片Stat看看返回错误没有 package main import ( "fmt" "os" ...

  10. itest(爱测试) 4.2.0 发布,开源BUG 跟踪管理 & 敏捷测试管理软件

    itest 入选 2019 年度最受欢迎开源中国软件 开源工具的发展,离不开你我的支持,需要您投上宝贵的一票  去投票 v4.2.0下载地址 :itest下载 itest 简介:查看简介 itest ...