面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux

1. 如果系统的 QPS 突然提升 10 倍该怎么设计?

1.1 硬件的扩展+微服务的拆分

如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法使用了。
在这里插入图片描述

于是,集群架构的架构开始出现,单机无法抗住的压力,最简单的办法就是水平拓展横向扩容。通过负载均衡把压力流量分摊到不同的机器上,暂时是解决了单点导致服务不可用的问题。
在这里插入图片描述
随着业务的发展,在一个项目里维护所有的业务场景使开发和代码维护变得越来越困难,一个简单的需求改动都需要发布整个服务,代码的合并冲突也会变得越来越频繁,同时线上故障出现的可能性越大。微服务的架构模式就诞生了。
在这里插入图片描述
把每个独立的业务拆分开独立部署,开发和维护的成本降低,集群能承受的压力也提高了,再也不会出现一个小小的改动点需要牵一发而动全身了。
以上的点从高并发的角度而言,似乎都可以归类为通过服务拆分和集群物理机器的扩展提高了整体的系统抗压能力,那么,随之拆分而带来的问题也就是高并发系统需要解决的问题。

1.2 高性能 RPC

微服务化的拆分带来的好处和便利性是显而易见的,但是需要考虑各个微服务之间的通信。
传统 HTTP 的通信方式性能首先并不太好,大量的请求头之类无效的信息是对性能的浪费,这时候就需要引入诸如 Dubbo 类的 RPC 框架。
在这里插入图片描述
经测试:Dubbo RPC 的性能,是 Feign RPC 的性能 10 倍(可能是这样)。RPC 框架本身一般都自带负载均衡、熔断降级的机制,可以更好的维护整个系统的高可用性。

1.3 消息队列削峰解耦

MQ 的主要功能:

  • 削峰填谷、解耦。
  • 同步转异步的方式,可以降低微服务之间的耦合。
    例如:对于一些不需要同步执行的接口,可以通过引入消息队列的方式异步执行以提高接口响应时间。在交易完成之后需要扣库存,然后可能需要给会员发放积分,本质上,发积分的动作应该属于履约服务,对实时性的要求也不高,我们只要保证最终一致性也就是能履约成功就行了。 对于这种同类性质的请求就可以走 MQ 异步,也就提高了系统抗压能力了。
    在这里插入图片描述

1.4 三级缓存架构

缓存作为高性能的代表,在某些特殊业务可能承担 90% 以上的热点流量。
对于一些活动比如秒杀这种并发 QPS 可能几十万的场景,引入缓存事先预热可以大幅降低对数据库的压力,10 万的 QPS 对于单机的数据库来说可能就挂了,但是对于如 redis 这样的缓存来说就完全不是问题。

在这里插入图片描述

以秒杀系统举例,活动预热商品信息可以提前缓存提供查询服务,库存数据可以提前缓存,下单流程可以完全走缓存扣减,秒杀结束后再异步写入数据库,数据库承担的压力就小的太多了。

1.5 数据库分库分表

对于整个系统而言,最终所有的流量的查询和写入都落在数据库上,数据库是支撑系统高并发能力的核心。
怎么降低数据库的压力,提升数据库的性能是支撑高并发的基石。主要的方式就是通过读写分离和分库分表来解决这个问题。
对于整个系统而言,流量应该是一个漏斗的形式。比如我们的日活用户DAU有20万,实际可能每天来到提单页的用户只有3万QPS,最终转化到下单支付成功的QPS只有1万。
那么对于系统来说读是大于写的,这时候可以通过读写分离的方式来降低数据库的压力。
读写分离也就相当于数据库集群的方式降低了单节点的压力。而面对数据的急剧增长,原来的单库单表的存储方式已经无法支撑整个业务的发展,这时候就需要对数据库进行分库分表了。
针对微服务而言垂直的分库本身已经是做过的,剩下大部分都是分表的方案了。

1.6 高可用

高可用(High Availability)是指系统在面临高并发、大流量及异常情况时,依然能够保持稳定运行,尽量避免服务中断,确保业务的连续性。高可用性策略包括多种技术手段,例如熔断、限流、降级、预案和核对等。

1.6.1 熔断

熔断(Circuit Breaker)是指当某个服务发生故障或响应时间过长时,自动切断对该服务的调用,防止故障蔓延影响到其他服务或整个系统。熔断器类似于电路中的断路器,通过监控服务的健康状况,当检测到服务出现大量异常或超时时,触发熔断机制。
示例场景:
在电子商务平台中,如果营销服务出现故障或响应时间过长,为避免影响下单主链路,可以使用熔断机制。此时系统暂时停止调用营销服务,确保订单创建流程不受影响。对于因营销服务不可用而导致的积分扣减等操作,可以在服务恢复后通过补偿机制进行补救。

1.6.2 限流

限流(Rate Limiting)是通过限制单位时间内某个服务或接口的访问次数,防止服务在高并发请求下被过载击垮。限流可以根据系统的压测结果,设置合理的阈值,确保系统在高并发场景下依然能够稳定运行。
示例场景:
在秒杀活动中,由于瞬间涌入的大量请求可能导致系统过载,限流机制可以对关键接口进行限制。例如,将秒杀商品的请求限制在每秒1000次以内,超过限制的请求将被拒绝或排队处理,从而保证系统的稳定性。

1.6.3 降级

降级(Fallback)是指在某个服务不可用或性能下降时,自动切换到降级方案,以保证核心功能的正常运行。降级通常与熔断结合使用,熔断触发后进入降级模式,待服务恢复正常后再重新启用。
示例场景:
如果营销服务熔断后,可以立即进入降级模式,即短时间内不再调用营销服务,而是提供一个默认的响应或提示用户稍后再试。当检测到营销服务恢复正常后,再恢复对其调用。

1.6.4 预案

预案(Contingency Plan)是指在系统运行过程中,提前制定的一系列应急处理方案。预案通常在业务高峰期(如促销活动、节假日)生效,通过合理的配置,确保在紧急情况下能够快速做出响应,进行必要的调整。一般来说,就算是有统一配置中心,在业务的高峰期也是不允许做出任何的变更的,但是通过配置合理的预案可以在紧急的时候做一些修改。
示例场景:
在双十一购物节期间,平台可能会遇到流量激增的情况。此时,预案可以包括调整限流阈值、启用备用服务器、临时关闭非核心功能等。通过统一配置中心进行快速配置变更,在不影响业务连续性的前提下应对突发状况。

1.6.5 核对

核对(Verification)是指针对分布式系统中的数据一致性问题,进行定期或实时的校验,确保数据的准确性和完整性。核对通常用于检测和纠正因系统故障、网络攻击等导致的数据异常。
针对各种分布式系统产生的分布式事务一致性或者受到攻击导致的数据异常,非常需要核对平台来做最后的兜底的数据验证。比如下游支付系统和订单系统的金额做核对是否正确,如果受到中间人攻击落库的数据是否保证正确性。
示例场景:
在支付系统中,为确保订单金额的一致性,可以对支付系统和订单系统的数据进行定期核对。如果发现数据不一致,需要及时查找原因并进行修复。核对还可以用于防范中间人攻击,通过验证落库数据的正确性,确保系统安全。

1.7 总结

设计高并发系统,需要从物理硬件层面到软件的架构、代码层面的优化,使用什么中间件来不断提高系统的抗压能力。
但是这个问题本身会带来更多的问题,微服务本身的拆分带来了分布式事务的问题,http、RPC 框架的使用带来了通信效率、路由、容错的问题,MQ 的引入带来了消息丢失、积压、事务消息、顺序消息的问题,缓存的引入又会带来一致性、雪崩、击穿的问题,数据库的读写分离、分库分表又会带来主从同步延迟、分布式 ID、事务一致性的问题,而为了解决这些问题又要不断的加入各种措施熔断、限流、降级、离线核对、预案处理等等来防止和追溯这些问题。

其他内容

之前的文章有对Springboot 启动时Bean的创建与注入这个过程的讲解以及对应的源码解读,感兴趣的可以去看看:
Springboot 启动时Bean的创建与注入(一)-源码解读-xunznux
Springboot 启动时Bean的创建与注入(二)-源码解读-xunznux
Springboot 的Bean生命周期五步、七步、十步详解以及框架源码解读
实现一个自己的OpenFeign 远程调用验证协议

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

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

相关文章

【Mysql】Docker下Mysql8数据备份与恢复

[TOC] 【Mysql】Docker下Mysql8数据备份与恢复 1 创建Mysql容器 格式 docker run -d --name容器名称 -p 宿主端口号:3306 -e MYSQL_ROOT_PASSWORDmysql密码 -e MYSQL_PASSWORDmysql密码 -e TZAsia/Shanghai -v 宿主目录-数据:/var/lib/mysql -v 宿主目录-备份数据:/back…

信息收集Part3-资产监控

Github监控 便于收集整理最新exp或poc 便于发现相关测试目标的资产 各种子域名查询 DNS,备案,证书 全球节点请求cdn 枚举爆破或解析子域名对应 便于发现管理员相关的注册信息 通过Server酱接口接收漏洞信息 https://sct.ftqq.com/ https://github.com/easych…

国内品牌推广全攻略:策略用对,成功翻倍!

在国内,推广品牌的常用策略多种多样,这些策略旨在提高品牌的知名度、美誉度和市场份额。 以下是一些常用的推广品牌策略: 码字不易,如果回答对您有所帮助,请不吝给一个三连哦! 1. 社交媒体营销 策略说明…

计算机网络基础:3.DNS服务器、域名分类

一、DNS服务器 DNS服务器在网络中的作用类似于餐厅中的“顾客座位对照表”,它帮助前台(路由器)将顾客(用户)的请求转发到正确的餐桌(目标设备)。 (1)概念与原理 DNS的基本概念 DNS&…

攻防世界 re新手模式

Reversing-x64Elf-100 64位ida打开 看if语句,根据i的不同,选择不同的数组,后面的2*i/3选择数组中的某一个元素,我们输入的是a1 直接逆向得到就行 二维字符数组写法:前一个是代表有几个字符串,后一个是每…

深入浅出WebRTC—LossBasedBweV2

WebRTC 同时使用基于丢包的带宽估计算法和基于延迟的带宽估计算法那,能够实现更加全面和准确的带宽评估和控制。基于丢包的带宽估计算法主要依据网络中的丢包情况来动态调整带宽估计,以适应网络状况的变化。本文主要讲解最新 LossBasedBweV2 的实现。 1…

linux操作系统之线程

1.线程概念 线程是一个轻量级进程,每一个线程都属于一个进程 进程是操作系统资源分配的最小单位,而线程是CPU任务调度的最小单位 线程是一个任务执行的过程,包括创建,调度,消亡 创建:线程空间位于进程空间,进程中的线程,栈区独立,并共享进程中的数据区,文本区,堆区 调度:宏观…

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…

【JavaScript】箭头函数

具体讲解 之前写 this 的指向时就提到过箭头函数,但是由于其比较复杂,还是单独开一篇来讲箭头函数。 箭头函数,箭头函数不能作为构造函数,没有原型 prototype,不能 new。 在箭头函数中,this 关键字指向的是…

刷机维修进阶教程-----何谓“tee损坏” 指纹丢失 掉帧 传感器失效?详细修复步骤教程

TEE损坏指的是安卓机型中Key Attestation密钥认证所依赖的可信应用中的证书库被破坏了。然后拒绝为指纹密匙认证提供服务。加密的密匙由TEE负责管理。tee损坏只影响当前机型的密匙认证。不影响加密。通俗的理解。如果你机型维修或者刷机或者解锁或者格机 全檫除分区等等后有异常…

vue3 + ts 报错:Parsing error: Unexpected token : eslint

报错:Parsing error: Unexpected token : eslint 解决: 在 .eslintrc.json 文件中加入 "parser": "babel/eslint-parser"配置 “parser”: “babel/eslint-parser” 告诉 ESLint 在检查代码之前,先使用 Babel 的解析器…

Chapter17 表面着色器——Shader入门精要学习

Chapter17 表面着色器 一、编译指令1.表面函数2.光照函数3.其他可选参数 二、两个结构体1.Input 结构体:数据来源2.SurfaceOutput 三、Unity背后做了什么四、表面着色器的缺点 一、编译指令 作用:指明该表面着色器的 表面函数 和 光照函数,并…

Google Chrome 浏览器在链接上点右键的快捷键

如今,越来越多的软件都懒得设个快捷键,就算设置了连个下划线也懒得加了。 谷歌浏览器右键 > 链接另存为... 和 复制链接地址 的快捷键 (如图)

微信小程序开发(百货商战)实战项目的购物车和个人中心的创建

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

一款异次元小清新风格的响应式wordpress个人博客主题

一款异次元小清新风格的响应式个人博客主题。这是一款专注于用户阅读体验的响应式 WordPress 主题,整体布局简洁大方,针对资源加载进行了优化。 Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净,简单且响应迅速的博客主题&#x…

iOS开发设计模式篇第一篇MVC设计模式

目录 1. 引言 2.概念 1.Model 1.职责 2.实现 3.和Controller通信 1.Contrller直接访问Model 2.通过委托(Delegate)模式 3.通知 4.KVO 4.设计的建议 2.View 1.职责 2.实现 3.和Controller通信 1. 目标-动作(Target-Action)模式 2…

Jolt路线图

1. 引言 a16z crypto团队2024年7月更新了其Jolt路线图: 主要分为3大维度: 1)链上验证维度: 1.1)Zeromorph:见Aztec Labs团队2023年论文 Zeromorph: Zero-Knowledge Multilinear-Evaluation Proofs from…

什么是PCB流锡槽焊盘/C型焊盘,如何设计?-捷配笔记

在PCB进行机器组装器件时(如波峰焊),为了防止部分需要二次焊接的元器件的焊盘堵孔,就需要在PCB焊盘上面开个过锡槽,以便过波峰焊时,这些焊锡会流掉。开流锡槽就是在焊盘裸铜(敷锡)部…

【MySQL进阶之路 | 高级篇】事务的ACID特性

1. 数据库事务概述 事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持一致性,同时我们还能通过事务的机制恢复到某个时间点,这样可以保证给已提交到数据库的修改不会因为系统崩溃而丢失。 1.1 基本概念 事务&…

微前端--single-spa

微前端 使用微前端的挑战: 子应用切换,应用相互隔离,互补干扰,子应用之前的通信,多个子应用并存,用户状态的存储,免登。 常用技术方案 路由分发式微前端 通过http服务的反向代理 http {serv…