java 高并发设计

 文章目录

目录

 文章目录

前言

一、通用设计

一、动静分离

二、数据库独立部署

三、问题

1.高并发通用设计方法

2.高并发系统的拆分顺序

二、计算资源高并发

三、网络资源高并发

超高性能场景(10万+ QPS)

中小规模场景(5万 QPS以下)

四、数据库高并发

五、



前言

高并发设计可以分为5个部分1.通用设计

1.

面对100万级别的QPS该怎么设计?

请看以下步骤


一、通用设计

一、动静分离

动静分离是高并发的第一步

最开始的项目我们都是要apache tomcat 来承载动态(java http请求)和静态文件(将html、css等放入static文件),而使用动静分离是指的将静态文件(前端预先加载到页面上的内容)放入nginx中

为什么用nginx,nginx处理性能大概是tomcat的4倍

使用云服务 

CDN(Content Delivery Network,内容分发网络) 是优化静态资源访问速度和降低服务器负载的核心手段

将全部资源交给云服务厂商的CDN来承载,还以获得90%的CPU节省

对比

场景CDN 直接承载Nginx + CDN
架构复杂度无需服务器,纯云服务需维护 Nginx 服务器
成本按需付费(存储+流量)服务器固定成本 + CDN 流量成本
扩展性自动弹性扩展需手动扩容服务器
适用场景纯静态资源

需动态生成内容(如缩略图)

二、数据库独立部署

如果使用nginx来承载静态资源之后,云主机还是扛不住流量,那么这时候就应该再用一台主机来:专门跑数据库,甚至有些数据库是部署到多台服务器上

一般来说我们不会将项目(后端代码)和数据库部署到同一台服务器上,这种是典型的灾难架构

这里建议直接使用云服务商的云数据库,因为一旦你的qps超过1000,自建数据库就很难满足要求了,如果搭建集群,小公司成本又太高,而直接使用云数据库就不会出现这种问题,他会自动调整资源



三、问题

1.高并发通用设计方法

高并发系统遇见瓶颈,一定是某个资源点到达极限,例如数据库,服务器,带宽等,因此需要找到这个受限点,拆分并解决

1.负载均衡:分散请求到多个服务器,减少单台服务器压力,例如nginx

2.缓存技术:将经常访问的数据放入缓存(内存中),减少数据库压力,并提高系统响应速度,例如redis

3.异步处理:多线程方式,让任务在后台处理,而主线程先返回。提高系统响应速度,释放服务器占用线程

4.消息队列:将庞大的任务,放入消息队列,由另一个线程或者多个线程来处理,实现异步,削峰,解耦等作用

5.数据库优化:优化SQL,设置数据库集群都可以提高数据库响应速度,从而提高系统响应

6.水平扩展:拆解系统,分别部署到不同服务器,来减少单台服务器cpu压力

7.服务隔离:高并发系统中,不同的模块或者说平台,一般都有隔离开,保证不同服务之间互不影响

2.高并发系统的拆分顺序

高并发系统的拆分应该从静态资源开始拆分,然后在到数据库和服务器机器分离,然后再设计负载均衡和分布式架构,最后再利用数据库集群和分布式数据库来提升数据库能力,期次再考虑其他优化手段

1.静态资源拆分:将原本后端项目集成的静态资源,拆分到nginx或者cdn中进行存储

2.数据库和后端服务机器分离:将数据库和后端服务放到不同的机器上,这样能减少数据库压力,并提高扩展能力

3.负载均衡和分布式架构:通过负载均衡将同一个项目部署到多台机器(也就是多个实例,换句话来说就是用户的请求分发到不同的机器上),提高系统处理能力,同时,采用分布式架构(将系统拆分成独立模块,再),利用多个机器同时进行服务,进一步提高系统并行能力

4.数据库集群和分布式数据库:数据库集群是将多个数据库实例分布到不同的服务器上,通过数据同步和故障转移机制,保证数据库的高可用,分布式数据库是将数据分散到多个节点上,每个数据只负责部分数据的存储和查询,从而提高整个系统的读写能力

5.基于地域进行数据库拆分:

3.静态资源如何加速:

1.高性能web服务器

2.CDN服务:将静态资源分散到全国,用户就能从最近的服务器获取消息,减少延迟

二、计算资源高并发

目标:拆分计算单点,提升并行能力。

主要是部署方法的转变 物理机 → 虚拟机 → 容器化,解决计算资源利用率与弹性问题。

阶段核心方案解决的问题瓶颈
单服务部署单机运行所有服务简单部署资源争抢(CPU/内存耗尽)
虚拟机部署VMware/KVM 虚拟化资源隔离,多应用共存虚拟机启动慢(分钟级)
容器化Docker + Kubernetes进程级隔离,秒级启动内核兼容性

三、网络资源高并发

这里大致总结:就是在7层网络模型上进行高并发的设计

首先gateway或者nginx单台支持的最大qps有限,通常32核的支持万级qps,那么怎么承担上百万QPS呢,这时候就需要在传输层搭建服务LVS,这里能支持百万级别QPS

层级OSI模型代表组件核心职责
数据链路层L2 (链路层)F5 (部分功能)MAC地址转发、VLAN隔离
网络层L3 (网络层)LVS、F5 (IP转发)IP包路由、四层负载均衡(TCP)
传输层L4 (传输层)LVS、HAProxyTCP/UDP连接分发
应用层L7 (应用层)Nginx/Kong/GatewayHTTP协议解析、动态路由

通过分层架构:

  1. L4 负载层:用低成本解决海量连接分发(LVS/硬件)

  2. L7 网关层:专注业务协议处理(Kong/Nginx)

  3. 业务层:无网络负担,专注计算

超高性能场景(10万+ QPS)

  • 优势

    • Nginx专做TLS解密(C语言极致性能)

    • Gateway专注业务路由(无需处理加密)

    • 整体吞吐量提升2倍+

实例:加入现在目标6万QPS

中小规模场景(5万 QPS以下)

下面是百万QPS的真实案例

层级组件配置数量总处理能力
网络入口LVS + DPDK64核/128G/100G网卡4台400万 CPS
TLS卸载Nginx + 加速卡32核/64G/SSL卡20台120万 TPS
业务网关Rust网关(io_uring)32核/64G30台450万 QPS
微服务商品服务16核/32G50台200万 QPS

四、数据库高并发

核心挑战:数据库是“最难以解决的单点”,因其需保证 ACID 事务。

  • 存储技术演进

    • 集中式存储(如 EMC):硬件级高可用,但成本极高(单 SAN 交换机超 40 万元)。

    • 分布式存储:通过 x86 服务器集群构建存储池,依赖 PCIe 5.0 和 CXL 协议提升 IO 性能,降低成本。

  • 数据库架构优化

    • 缓存策略:Redis 缓存热点数据,OceanBase 等分布式数据库采用“内存全缓存 + Redo Log 落盘”方案。

    • 分布式方案

      • TiDB(计算存储分离)、ClickHouse(列存储)解决海量数据分析瓶颈。

      • 分库分表 + Paxos 协议保障数据一致性与高可用。

为了提高数据库读写能力,搭建读写分离1主多从,提高读能力,那么写能力呢,写是往主节点写入的,这时候就需要分布式架构了

第一代分布式架构 使用中间件 sharding-jdbc,但是可以说是属于应用层面不,不属于通用数据库范畴

第二代,出现了kv型数据库,nosql(redis)KV 数据库结构简单,性能优异,扩展性无敌,但是它只能作为核心数据库的高性能补充

第三个时代,newSQL,目前比较常见的 NewSQL 有 ClustrixDB、NuoDB、VoltDB,国内的 TiDB 和 OceanBase 也属于 NewSQL

第四个时代,云上数据库 例如阿里的PolarDB 

缓存和队列

缓存(redis)消读的峰,而队列(rockemq,kafka)消写的峰

五、

持续更新。。。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker compose搭建elk 8.6.2

环境搭建 选用版本是比较新的版本 (ELK) 8.6.2 ,elk的环境做的还是比较好的又windows和Linux多个版本,并且开箱即用。本地直接下载官方软件也是可以的。最近在学习docker compose,就使用这个环境搭建一下。 前置条件 安装好docker和 docke…

Springboot3+的id字符串转化问题

以下是纯后端实现 Long/BigInteger ID 转为 JSON 字符串 的详细配置方案&#xff0c;基于 Spring Boot 3 和 SpringDoc (OpenAPI) 最新实践 ✨ 1. 添加依赖 确保你的 pom.xml&#xff08;或 Gradle&#xff09;中包含&#xff1a; <dependency><groupId>com.fast…

C#学习第30天: 匹配模式

模式匹配&#xff08;Pattern Matching&#xff09;是 C# 中一个强大且灵活的特性&#xff0c;允许开发者以更直观的方式检查数据结构&#xff0c;并根据特定模式执行操作。 随着 C# 语言版本的发展&#xff0c;模式匹配的功能越来越丰富&#xff0c;为处理复杂数据提供了极大…

SQL进阶之旅 Day 29:NoSQL结合使用策略

【SQL进阶之旅 Day 29】NoSQL结合使用策略 文章简述 随着数据量的激增和业务场景的复杂化&#xff0c;传统关系型数据库在某些场景下已难以满足高性能、高扩展性和灵活数据结构的需求。NoSQL&#xff08;非关系型数据库&#xff09;以其高可扩展性、灵活的数据模型和分布式架构…

PostgreSQL 对 IPv6 的支持情况

PostgreSQL 对 IPv6 的支持情况 PostgreSQL 全面支持 IPv6 网络协议&#xff0c;包括连接、存储和操作 IPv6 地址。以下是详细说明&#xff1a; 一、网络连接支持 1. 监听 IPv6 连接 在 postgresql.conf 中配置&#xff1a; listen_addresses 0.0.0.0,:: # 监听所有IPv4…

模板字符串使用点击事件【VUE3】

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目中使用模板字符串的时候很多&#xff0c;有些时候需要再模板字符串中使用点击事件&#xff0c;那么在模板字符串中可以使用点击事件么&#xff1f;如果这个点击事件需要传参呢&#xff1f; 答案…

AI——DeepSeek+LangChain+streamlit 实现智能汽车维修服务

效果图 分析流程 代码实现 废话少说&#xff0c;直接上代码 from langchain_core.language_models.llms import BaseLLM from langchain_core.outputs import Generation, LLMResult from pydantic.v1 import Field, validator from typing import Any, Dict, List, Optional…

《C++ 继承》

目录 继承的定义 继承类模板 派生类和基类之前的转换 隐藏 派生类的默认成员函数 不能被继承的类 继承中的友元和静态成员 继承模型 继承的定义 继承的本质是一种复用。规定Person类为基类&#xff0c;Student类为派生类 。 继承方式分为public继承&#xff0c;prote…

金蝶K3 ERP 跨网段访问服务器卡顿问题排查和解决方法

我一朋友公司反应&#xff0c;公司网络卡顿&#xff0c;测试掉包严重&#xff0c;抓包wireshark测试&#xff0c;发现arp包有大量mac欺骗&#xff0c;因为公司有几百台电脑&#xff0c;所以建议更换了三层交换机&#xff0c;划分了vlan&#xff0c;这样有效的避免了网络风暴等&…

无需安装!在线数据库工具 :实战 SQL 语句经典案例

在数字化时代&#xff0c;SQL&#xff08;结构化查询语言&#xff09;已成为数据从业者、开发人员乃至业务分析人员必备的核心技能。无论是处理日常数据报表&#xff0c;还是应对复杂的业务逻辑&#xff0c;SQL 都能高效实现数据的查询、操作与分析。本文将通过经典的 SQL 练习…

如何在网页里填写 PDF下拉框

对于PDF 开发者或网页开发者来说&#xff0c;让用户在网站上填写 PDF 下拉框&#xff08;Combo Box&#xff09;是一个棘手的问题。因为 PDF 并不是一种原生的 Web 格式&#xff0c;浏览器通常不允许用户与 PDF 下拉框进行交互。 那么&#xff0c;如何让用户在 HTML 中填写 PD…

.Net 优秀框架 ABP全面详解

文章目录 第一部分&#xff1a;ABP框架概述与核心架构1.1 ABP框架简介1.2 ABP框架架构解析1.2.1 表现层(Presentation Layer)1.2.2 分布式服务层(Distributed Service Layer)1.2.3 应用层(Application Layer)1.2.4 领域层(Domain Layer)1.2.5 基础设施层(Infrastructure Layer)…

力扣-198.打家劫舍

题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋…

windows 安装vllm cuda版本

windows 安装cuda版本 查看window cuda版本 nvidia-smi vllm 获取镜像,此版本需要cuda 版本12.8 或以上 docker pull vllm/vllm-openai:latest下载模型 git lfs installcd e:\ai mkdir vllm\models\qwen2cd vllm\models#通过git下载git clone https://www.modelscope.c…

Node.js特训专栏-基础篇:1. Node.js环境搭建与项目初始化详细指南

我将为你详细讲解 Node.js 环境搭建与项目初始化的步骤&#xff0c;包含常见问题解决和最佳实践&#xff0c;帮助你快速上手。 详细步骤说明 1. 环境搭建 Windows用户&#xff1a; 访问Node.js官网(https://nodejs.org)下载LTS版本安装包&#xff08;推荐长期支持版&#xf…

13.安卓逆向2-frida hook技术-HookJava构造方法

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

php基础:常见函数

内建函数 文章目录 内建函数1、文件操作函数&#xff1a;2、代码执行函数&#xff1a;3、反序列化函数&#xff1a;4、数据库操作函数&#xff1a;5、类型转换与比较函数&#xff1a;6、其他常见函数&#xff1a; 1、文件操作函数&#xff1a; include(): 导入并执行指定的 PHP…

教程:PyCharm 中搭建多级隔离的 Poetry 环境(从 Anaconda 到项目专属.venv)

核心思维&#xff1a;为什么需要 “多级隔离”&#xff1f; 在复杂项目中&#xff0c;环境冲突是最棘手的问题&#xff08;比如系统 Python 版本不同、依赖包版本冲突&#xff09;。通过 “Anaconda 虚拟环境 → 项目 Poetry 环境 → 工具级隔离” 的三层架构&#xff0c;实现…

Rollup vs Webpack 深度对比:前端构建工具终极指南

前端工程领域始终面临一个根本选择&#xff1a;如何在模块化编码规范与工程化构建效率之间取得最佳平衡。Rollup与Webpack分别代表着两种不同维度的解决方案&#xff0c;本文将揭示它们的真实应用场景与核心差异。 一、核心差异全景图&#xff08;附最新对比&#xff09; 核心能…

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…