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.rhkb.cn/news/9606.html

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

相关文章

mysql.sock.lock 导致mysql重启失败

背景 今天公司物业断电,导致机房服务器停电宕机,所有的服务都得重启。本着mysql实例都做了服务自启动,所以没有太担心影响开发的日常工作。但是今天一上班开发就找来,各种服务都没起来有问题,数据库连不上。马上登陆数…

Hive:Hive Shell技巧

在终端命令窗口不能直接执行select,creat等HQL命令,需要先进入hive之后才能执行,比较麻烦,但是如果使用Hive Shell就可以直接执行 在终端只执行一次Hive命令 -e 参数, "execute"(执行),使用-e参数后会在执行完Hive的命令后退出Hive 使用场景:…

C++:PTA L2-003 月饼

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。 注意:销售时允许取出一部分库存。样例给出的情形是这样的&#…

力扣面试150 快乐数 循环链表找环 链表抽象 哈希

Problem: 202. 快乐数 👩‍🏫 参考题解 Code public class Solution {public int squareSum(int n) {int sum 0;while(n > 0){int digit n % 10;sum digit * digit;n / 10;}return sum;}public boolean isHappy(int n) {int slow n, fast squa…

春晚舞台上的人形机器人:科技与文化的奇妙融合

文章目录 人形机器人Unitree H1的“硬核”实力传统文化与现代科技的创新融合网友热议与文化共鸣未来展望:科技与文化的更多可能结语 2025 年央视春晚的舞台,无疑是全球华人目光聚焦的焦点。就在这个盛大的舞台上,一场名为《秧BOT》的创意融合…

架构技能(六):软件设计(下)

我们知道,软件设计包括软件的整体架构设计和模块的详细设计。 在上一篇文章(见 《架构技能(五):软件设计(上)》)谈了软件的整体架构设计,今天聊一下模块的详细设计。 模…

2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文

模型设计思路与创新点: 建模的时候应该先确定我们需要建立什么类的模型?优化类还是统计类?这个题需要大量的数据分析,因此我们可以建立一个统计学模型。 统计学建模思路:观察规律,建立模型,参…

FireFox | Google Chrome | Microsoft Edge 禁用更新 final版

之前的方式要么失效,要么对设备有要求,这次梳理一下对设备、环境几乎没有要求的通用方式,universal & final 版。 1.Firefox 方式 FireFox火狐浏览器企业策略禁止更新_火狐浏览器禁止更新-CSDN博客 这应该是目前最好用的方式。火狐也…

关联传播和 Python 和 Scikit-learn 实现

文章目录 一、说明二、什么是 Affinity Propagation。2.1 先说Affinity 传播的工作原理2.2 更多细节2.3 传播两种类型的消息2.4 计算责任和可用性的分数2.4.1 责任2.4.2 可用性分解2.4.3 更新分数:集群是如何形成的2.4.4 估计集群本身的数量。 三、亲和力传播的一些…

使用 postman 测试思源笔记接口

思源笔记 API 权鉴 官方文档-中文:https://github.com/siyuan-note/siyuan/blob/master/API_zh_CN.md 权鉴相关介绍截图: 对应的xxx,在软件中查看 如上图:在每次发送 API 请求时,需要在 Header 中添加 以下键值对&a…

万物皆有联系:驼鸟和布什

布什?一块布十块钱吗?不是,大家都知道,美国有两个总统,叫老布什和小布什,因为两个布什总统(父子俩),大家就这么叫来着,目的是为了好区分。 布什总统的布什&a…

C++ ——— 仿函数

目录 何为仿函数 仿函数和模板的配合使用 何为仿函数 代码演示: class Add { public:int operator()(int x, int y){return x y;} }; 这是一个 Add 类,类里面有一个公有成员函数重载,重载的是括号 那么调用的时候: Add ad…

Charles 4.6.7 浏览器网络调试指南:流量过滤与分析(六)

1. 概述 在网络调试和优化过程中,Charles 不仅可以实现简单的网络抓包操作,还支持更高级的抓包技巧和流量分析功能。这些功能能够帮助开发者深入挖掘网络请求的细节,为复杂问题提供有效的解决方案。本文将重点讲解 Charles 的过滤规则、自定…

Haproxy入门学习二

一、Haproxy的算法 1.haproxy通过固定参数balance指明对后端服务器的调度算法,其中balance参数可以配置在listen或backend选项中 2.haproxy的调度算法分为静态和动态调度算法,其中有些算法可以根据参数在静态和动态算法中相互转换 3.静态算法&#xff1a…

程序地址空间

程序地址空间回顾(这真的是吗?) 我们之前学习C/C的时候是否听过:对于自己的C/C程序,我们默认认为自己的内存地址空间是: 代码区(Text Segment):存放程序的机器指令代码&…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.21 索引宗师:布尔索引的七重境界

1.21 索引宗师:布尔索引的七重境界 目录 #mermaid-svg-Iojpgw5hl0Ptb9Ti {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Iojpgw5hl0Ptb9Ti .error-icon{fill:#552222;}#mermaid-svg-Iojpgw5hl0Ptb9Ti .…

nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

一、安装nvm 1. 下载nvm 点击 网盘下载 进行下载 2、双击下载好的 nvm-1.1.12-setup.zip 文件 3.双击 nvm-setup.exe 开始安装 4. 选择我接受,然后点击next 5.选择nvm安装路径,路径名称不要有空格,然后点击next 6.node.js安装路径&#…

【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)

1. 简介 柱状图作为科研论文中常用的实验结果对比图,本文采用了3组实验对比的效果展示图,代码已调试好,只需替换数据即可生成相关柱状图,为科研加分。通过获得Nature配色的柱状图,让你的论文看起来档次更高&#xff0…

CTFSHOW-WEB入门-命令执行29-32

题目:web 29 题目:解题思路:分析代码: error_reporting(0); if(isset($_GET[c])){//get一个c的参数$c $_GET[c];//赋值给Cif(!preg_match("/flag/i", $c)){eval($c);//if C变量里面没有flag,那么就执行C…

【以音频软件FFmpeg为例】通过Python脚本将软件路径添加到Windows系统环境变量中的实现与原理分析

在Windows系统中,你可以通过修改环境变量 PATH 来使得 ffmpeg.exe 可在任意路径下直接使用。要通过Python修改环境变量并立即生效,如图: 你可以使用以下代码: import os import winreg as reg# ffmpeg.exe的路径 ffmpeg_path …