17 一个高并发的系统架构如何设计

高并发系统的理解

第一:我们设计高并发系统的前提是该系统要高可用,起码整体上的高可用。
第二:高并发系统需要面对很大的流量冲击,包括瞬时的流量和黑客攻击等
第三:高并发系统常见的需要考虑的问题,如内存不足的问题,服务抖动的问题、磁盘不足的问题、网络带宽的问题、突发流量的问题、面对黑客攻击的问题

高并发的架构设计

  1. 垂直拆分业务
    一个大型的系统业务相对复杂,不同的业务需要面对的流量压力也不同。我们可以根据不同的业务垂直拆分业务(DDD),我们可以根据业务拆也可以根据机器的特性拆服务,这些就要看具体的业务和系统运营方向。
    微服务拆分需要把一个单体的应用,按照一定的维度(业务域的维度、机器特性的维度等等)拆分成多个服务模块。
    例如:电商系统拆分成用户系统、订单系统、商品系统。

  2. 数据的垂直和水平拆分+分库分表

网络请求的流量虽然可以通过缓存,mq的削峰等缓解压力,但最终数据部分的压力还是会压到数据库上。数据库的垂直拆分主要是根据我们上面的垂直拆分业务后,根据对应模块的业务做对应的数据库设计。
我们分库还有一个原则就是一个数据库实例操作数据的瓶颈受到数据库引擎程序执行的瓶颈影响,所以在高并发的环境下,做好了垂直拆分的数据库,如果一个数据库实例承载不了并发的情况下,我们也要做水平拆分,一般会根据主键hash求模或数值型主键求模做水平拆分。
分表的场景主要面对单表数据库过大的场景使用。
数据库的分库分表主要使用mycat(由于做的不是很完善,特别是跨库查询的问题用的人越来越少,sharding jdbc(目前主流的用法))。

  1. 数据库的读写分离、双主等
    在高并发的场景中,我们单库能够承载1000左右的tps,如果并发太高对数据库的压力就会很大。不过我们的业务一般都是读多写少的场景,这个时候我们可以考虑数据库的一主多备的部署,读操作从备库中读取。
    还有我们的系统后台管理,经常会有慢sql查询,这些可以单独拿出来备库做后管的操作。防止一些复杂查询造成数据库的整体性能的下降。
    数据库的主从复制是通过binlog同步的,如果考虑到高可用也可以做双主HA的部署方式。这个要看具体的业务场景。

  2. 连接池

应用程序从存储中获取数据需要建立连接,我们需要使用连接池。例如:数据库连接池、redis连接池,线程池。

  1. 缓存
    缓存是我们我们设计高并发系统常用的手段。缓存的使用主要是提升系统的整体访问性能。缓存的思想在其他的设计上也大量被使用,比如cpu的设计、操作系统、web应用、浏览器等等都大量使用到缓存。
    设计高并发的系统常用的缓存有:redis缓存、JVM本地缓存(堆内存需要程序处理),nginx本地缓存、memcached、CDN静态资源的缓存等。

使用缓存需要注意以下几点的问题:
缓存与数据库数据一致性的问题(延迟双删)
缓存雪崩的问题(缓存大面积的失效,或者redis宕机等):设置redis的缓存有效时间的均匀分布、数据的预热(多应对突发事件,比如热点新闻),redis服务的高可用部署
缓存的击穿问题:一个redis的key失效后,大量请求的涌入到数据库,造成数据库的压力。设置热点数据的过期时间、定时更新策略,锁操作(如果请求拿不到Key先锁住,等数据放入缓存再释放锁)
缓存穿透问题:用户请求的数据缓存和数据库中都没有,但是请求依然不断的涌入,对数据库造成的压力。对于穿透问题,我们可以在业务层先校验,数据库中没有的数据设置在缓存中设置过期时间,该时间内不在请求到数据库

CDN静态资源缓存:将静态的资源放到位于多个物理位置的机房,用户访问静态资源的时候访问到就近的机器,加快了访问速度。

  1. 异步,mq削峰

我们的系统在做一些活动的时候,会产生一些瞬时的高峰流量,这些请求如果直接和数据库交互处理业务的时候会把数据库压垮。我们把请求发送到mq中通过异步处理的方式,减轻瞬时流量带来的冲击。当然mq还有分布式解耦等其他使用场景,这里不做细说。

  1. 熔断

熔断是保护系统稳定性的一种手段,在流量比较大的情况下,会出现部分服务的性能瓶颈造成整个服务不可用的情况。例如由于某一个慢sql降低了数据库的性能,其他请求积压过来,数据库的引擎程序处理不了造成数据库的假死。再造成整个服务不可用的情况。这个时候我们就需要采用熔断的手段,比如系统响应时间过慢后来的请求就会转发到错误页面。我们可以使用springcloud 的hystrix组件来做熔断

  1. 限流

由于我们的系统会有短暂的峰值请求流量进来,我们的CPU,内存,线程数据库在面临短暂的流量高峰无法应对的时候,需要做限流的设置。前面我们讲到一些分布式限流的算法。这里就不再详细叙述。

  1. 扩容
    如果我们的产品随着营运力度的加大,用户不断的增长,原理部署了5台服务器已经满足不了业务的发展。所以在架构设计之初就要考虑到系统支持动态的扩容的功能。比如我们的sharding jdbc支持数据库的动态扩容,还要考虑生成id的策略,是否支持为了增加机器即可的架构方案,我们从单机房部署到多机房部署时是否能平滑扩容。编码能不能支持。特别注意一点就是我们的架构设计中的状态保持和水平扩展库之后原先的数据是否能正常读取的问题

  2. 海量数据的处理问题
    面对大量的数据搜索一般使用elasticsearch,es本身就支持动态的扩容。大数据的存储一般用到hbase、clickhouse等。

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

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

相关文章

2025数学建模美赛|F题成品论文

国家安全政策与网络安全 摘要 随着互联网技术的迅猛发展,网络犯罪问题已成为全球网络安全中的重要研究课题,且网络犯罪的形式和影响日益复杂和严重。本文针对网络犯罪中的问题,基于多元回归分析和差异中的差异(DiD)思…

适配Android16

Android16新特性 Android 16带来了许多新特性和改进,提升了系统的流畅度、用户体验和安全性。对于应用开发者来说,适配Android 16可以确保应用在该版本上的兼容性和性能,同时也可以利用其新特性为用户提供更好的服务。以下是Android 16的一些…

【C++数论】880. 索引处的解码字符串|2010

本文涉及知识点 数论:质数、最大公约数、菲蜀定理 LeetCode880. 索引处的解码字符串 给定一个编码字符串 s 。请你找出 解码字符串 并将其写入磁带。解码时,从编码字符串中 每次读取一个字符 ,并采取以下步骤: 如果所读的字符是…

【MQ】如何保证消息队列的高可用?

RocketMQ NameServer集群部署 Broker做了集群部署 主从模式 类型:同步复制、异步复制 主节点返回消息给客户端的时候是否需要同步从节点 Dledger:要求至少消息复制到半数以上的节点之后,才给客户端返回写入成功 slave定时从master同步数据…

ESP32 I2S音频总线学习笔记(二):I2S读取INMP441音频数据

简介 在这个系列的上一篇文章中,我们介绍了ESP32 I2S音频总线的相关知识,简要了解了什么是I2S总线、它的通信格式,以及相关的底层API函数。没有看过上篇文章的可以点击文章进行回顾: ESP32 I2S音频总线学习笔记(一&a…

EasyExcel使用详解

文章目录 EasyExcel使用详解一、引言二、环境准备与基础配置1、添加依赖2、定义实体类 三、Excel 读取详解1、基础读取2、自定义监听器3、多 Sheet 处理 四、Excel 写入详解1、基础写入2、动态列与复杂表头3、样式与模板填充 五、总结 EasyExcel使用详解 一、引言 EasyExcel 是…

objection的简单使用

objection环境配置 下载以下版本 objection1.11.0 frida-tools9.2.4 python3.8.8 报错的话看这里: 在这个网站下载frida-tools14.2.18的离线包Links for frida 然后放入C:\Users\Asus\frida-14.2.18-py3.8-win-amd64.egg文件夹下 执行poetry add frida-tools14.2.18 ob…

危机13小时:追踪一场GitHub投毒事件

事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…

【Redis】缓存+分布式锁

目录 缓存 Redis最主要的使用场景就是作为缓存 缓存的更新策略: 1.定期生成 2.实时生成 面试重点: 缓存预热(Cache preheating): 缓存穿透(Cache penetration) 缓存雪崩 (Cache avalan…

记录 | MaxKB创建本地AI智能问答系统

目录 前言一、重建MaxKBStep1 复制路径Step2 删除MaxKBStep3 创建数据存储文件夹Step4 重建 二、创建知识库Step1 新建知识库Step2 下载测试所用的txtStep3 上传本地文档Step4 选择模型补充智谱的API Key如何获取 Step5 查看是否成功 三、创建应用Step1 新建应用Step2 配置AI助…

C#新语法

目录 顶级语句(C#9.0) using 全局using指令(C#10.0) using资源管理问题 using声明(C#8.0) using声明陷阱 错误写法 正确写法 文件范围的命名空间声明(C#10.0) 可空引用类型…

基于dlib/face recognition人脸识别推拉流实现

目录 一.环境搭建 二.推拉流代码 三.人脸检测推拉流 一.环境搭建 1.下载RTSP服务器MediaMTX与FFmpeg FFmpeg是一款功能强大的开源多媒体处理工具,而MediaMTX则是一个轻量级的流媒体服务器。两者结合,可以实现将本地视频或者实时摄像头画面推送到RTSP流,从而实现视频…

Couchbase UI: Analytics

Couchbase 的 Analytics 页面是用于执行分析查询的部分,允许用户对存储在 Couchbase 中的数据进行复杂的分析和聚合。Analytics 提供了 SQL-like 查询语言(N1QL for Analytics),使得用户能够轻松地执行数据分析任务。以下是关于 C…

梯度下降优化算法-Adam

Adam(Adaptive Moment Estimation)是一种结合了动量法(Momentum)和 RMSProp 的自适应学习率优化算法。它通过计算梯度的一阶矩(均值)和二阶矩(未中心化的方差)来调整每个参数的学习率…

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完结)

Understanding Diffusion Models: A Unified Perspective(六)(完结) 文章概括指导(Guidance)分类器指导无分类器引导(Classifier-Free Guidance) 总结 文章概括 引用: …

【PySide6快速入门】信号与槽的使用

文章目录 前言什么是信号与槽信号与槽的功能最简单的信号与槽控件连接信号与信号的连接总结 前言 在 PySide6 中,信号与槽机制是核心概念之一,它是 Qt 库中事件通信的基础。通过信号与槽,开发者能够实现不同组件之间的解耦,从而使…

GOGOGO 枚举

含义:一种类似于类的一种结构 作用:是Java提供的一个数据类型,可以设置值是固定的 【当某一个数据类型受自身限制的时候,使用枚举】 语法格式: public enum 枚举名{…… }有哪些成员? A、对象 public …

AWTK 骨骼动画控件发布

Spine 是一款广泛使用的 2D 骨骼动画工具,专为游戏开发和动态图形设计设计。它通过基于骨骼的动画系统,帮助开发者创建流畅、高效的角色动画。本项目是基于 Spine 实现的 AWTK 骨骼动画控件。 代码:https://gitee.com/zlgopen/awtk-widget-s…

[免费]基于Python的Django博客系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的基于Python的Django博客系统,分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展,信息的传播与…

如何将电脑桌面默认的C盘设置到D盘?详细操作步骤!

将电脑桌面默认的C盘设置到D盘的详细操作步骤! 本博文介绍如何将电脑桌面(默认为C盘)设置在D盘下。 首先,在D盘建立文件夹Desktop,完整的路径为D:\Desktop。winR,输入Regedit命令。(或者单击【…