高并发:最大程度抗量

本文探讨了高并发场景下的抗量策略,包括TCP连接的抗量、QPS计算与优化、限速措施以及提升处理效率的架构设计。强调了Nginx和Redis在抗量中的作用,提出了通过优化单个请求处理时间和利用消息中间件、分布式数据库等手段提升系统并发能力。

目录

指标

关键指标:

关键指标的维度:

引申指标:

高并发现状

抗量思路

1、谁来做应用最前面的TCP连接抗量呢?

2、TCP连接量有人抗了,那么如何抗QPS?

3、限速

提升处理效率

架构设计:

应用:

数据库:


指标

  • 关键指标:

  • 并发数SBC(Simultaneous Browser Connections),客户端向服务器发起请求,并建立了TCP连接。每秒钟【服务器】接收到的链接的总TCP数量
  • 响应时间(Response Time):从发送http请求(并发数),到处理完所有的http请求(并发数)所用到的时间
  • 每秒请求数QPS/RPS(Query Per Second/Request Per Second):Query=查询,也相当于请求。请求数指的是客户端在建立完连接后,向http服务发出GET/POST/HEAD数据包;
  • 每秒事务处理量TPS(Transaction Per Second)
  • 吞吐量(Throughput)
  • 同时在线用户数量

搜索结果的 Average-Time :  一般从C端用户体验来说,Average-Time 不能超过3秒的。

​​​​​​

TPS和QPS的区别:

打个比方:你在系统上点击【同步数据】功能,这是一个事务,所以【TPS=1】;但这个事务可能需要调用A服务器的n个接口,给服务器发送n个request,所以【QPS=n】;

TPS一般会比QPS少好几个数量级,常见QPS有到亿的但TPS只到万;

  • 关键指标的维度:

-平均,如:小时平均、日平均、月平均

-TP(Top Percentile),Top百分数,如:TP50、TP90、TP99、TP4个9

-最大值

-趋势

  • 引申指标:

-活跃用户数,如:日活DAU(Daily Active User)、月活MAU(Monthly Active Users)

  DAU=QPS*200;业内一般是放大200倍计算

-点击量PV(Page View)

-访问某站点的用户数UV(Unique Visitor)

-独立IP数IP(Internet Protocol)

-日单量

高并发现状

下面是网上查的资料:

2021全国总人口是14亿多;

2019年的【淘宝双十一】从零点开始,不到100秒,仅仅96秒,淘宝就达成了100亿的交易额!

淘宝【双十一】的QPS是1.05亿,平均每秒完成1.05亿交易额;

支付宝【双十一】的QPS是百万级(100万);

支付宝【双十一】的数据库请求峰值:4200万/秒;

12306火车票的QPS也是百万级;

携程旅行的高峰QPS也是百万级;

所以,一般业务并发没有上面那么牛的,吹个【单机】QPS=2万+ ,线上有4台服务器做负载均衡就行了;吹牛吹个千万级的QPS就过了;

如果一次性可以处理100个请求,每个请求耗时100毫秒,则 QPS = 1000(100/0.1)
如果一次性可以处理50个请求,每个请求耗时200毫秒,则 QPS = 250(50/0.2)
所以QPS与单个请求处理时间以及服务器一次性可以处理多少请求是成比例关系的。

服务器配置有好有坏,比如【高配物理机】和【低配虚拟机】;通常的配置有:cpu、内存、磁盘、带宽、网卡;

单机QPS的上限是多少呢?
说到单机,你必须明确指出硬性指标,CPU、内存、硬盘、带宽等
假定 CPU为4核、内存8G、硬盘7200转、带宽10M

又比如:

固态硬盘SSD(Solid State Disk)说:我读取和写入高达 1G/秒

mysql说:我单机TPS 1W+

nginx说:我单机QPS 10W+

静儿说:给我一台56核200G高配物理机,我可以创建一个单机QPS1000W

每台搜索实例的QPS(搜索有50~60台虚拟机实例,按最大并发量,每台请求吞吐量>1000)。

注意:内存占用超过50%就影响性能了

QPS计算需多少台服务器

原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间 
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS) 
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器 

 那么,单台机器的QPS是多少呢?

先笼统给出一个结论:单机性能QPS达到几千已经比较优秀了!

若按照5W TCP连接来算,这个时候的qps可以推断为5000。

服务器一般都是购买的,性能上一般一致,大概2000-3000;

1G【内存】抗 10万 TCP,QPS大概为1W;

若内存为10G,则QPS理论上10W,但内存使用率不能超过50%,否则影响性能,那么认为10G内存对应 5W QPS,那么:

若目标QPS为200W,那么所需要的的服务器台数为:200W / 5W = 40台;

抗量思路

1、谁来做应用最前面的TCP连接抗量呢?

  • nginx:支持数以“百万级”别的TCP连接,高达 50,000 个并发响应;
  • Redis:Redis 的性能非常高,号称单机 QPS 能抗 10W 的并发;

       Redis官方压测每秒10万每秒,如果线上Redis集群规模是128片,在流量均匀的场景,每次请求我们按3次Redis交互,那么能抗的量为128*10/3=426W

一般情况下nginx就可以;

2、TCP连接量有人抗了,那么如何抗QPS?

“ 如果一次性可以处理100个请求,每个请求耗时100毫秒,则 QPS = 1000(100/0.1)”

上面这句话反应的信息是:若提升处理单个请求的耗时,那么QPS就提升了;

所以抗QPS的方法落到 “如何提升处理单个请求的耗时” 上;

3、限速

QPS是以【秒】为衡量单位的,但打到服务器的高并发请求可能是在同一【毫秒】进来的,且在1秒的时间内不均匀:第1毫秒接受600万的并发,第2毫秒0并发,第3毫秒0并发... ...

于是可以通过 “限速” 在每毫秒接收10万的并发;使并发量 “均匀” ;这样服务器的压力也小些;

提升处理效率

互联网分布式架构设计,提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。

  • 垂直扩展:提升单机处理能力。垂直扩展的方式又有两种:
  1. 增强单机硬件性能,例如:增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G;
  2. 提升单机架构性能,例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间;
  • 水平扩展:只要增加服务器数量,就能线性扩充系统性能。水平扩展对系统架构设计是有要求的,如何在架构各层进行可水平扩展的设计是本文重点讨论的内容。

 这块参考:抗住百万高并发的 6 个关键技术! - Java技术栈 - 博客园

ps: CDN 利用全局负载均衡技术将用户的访问指向离用户最近的工作正常的流媒体服务器上,由流媒体服务器直接响应用户的请求。服务器中如果没有用户要访问的内容,会根据配置自动从原服务器抓取相应的内容并提供给用户;

架构设计:

  • 分布式
  • 分区集群
  • 负载均衡:使用LVS或F5来使多个Nginx负载均衡,通过DNS轮询实现机房间LVS的负载均衡;
  • 消息中间件
  • 自动扩容:Docker+K8s
  • 加速:DOK阿里云CDN加速技术,CDN也能自动扩容
  • 水平可扩展   
  • 动静分离(前端资源)
  • 热点的发现与隔离
  • 请求分层过滤

     

应用:

  • 资源隔离
  • 应用降级
  • 服务解耦
  • 读写分离
  • 大应用拆分小应用
  • 复用的功能抽离成微服务
  • 引入企业服务总线ESB屏蔽服务接口的访问差异

数据库:

并发:

提前创建线程

线程池技术

线程池隔离

### Redis 应对高并发的方法 #### 集群模式下的高并发处理 Redis通过集群模式来提升系统的高并发处理能力。集群能够实现节点的灵活上下线控制,使得数据可以在个节点间分布存储并提供服务[^2]。 - **槽位机制**:集群内部采用槽的概念,将键空间划分成固定的16384个槽。每个key根据CRC16算法计算得到一个0至16383之间的数值作为其所属槽号,进而决定由哪个节点负责此key的数据读写操作。 - **数据迁移**:当集群拓扑发生变化时(比如新增或移除节点),部分槽会连同其所关联的数据一起迁移到其他节点上去,从而保持整体负载均衡状态。 ```python # Python客户端连接Redis Cluster实例 from rediscluster import RedisCluster startup_nodes = [{"host": "192.168.1.1", "port": "7000"}] rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True) print(rc.get('foo')) ``` #### 处理热点Key问题 针对可能出现的热点Key情况,采取种措施减轻单一服务器的压力: - **限流降级**:设置每秒最大请求数限制,超过限额则返回错误响应给调用方;也可以考虑主动下架热门商品等方式减少对该特定资源的竞争程度。 - **分布式锁**:利用Redlock算法或其他类似的方案,在台机器上同步获取互斥锁,防止同一时刻有过进程试图修改同一个共享变。 - **异步加载/预热缓存**:提前预测哪些项目将成为未来的焦点对象,并预先将其加载入内存中等待查询到来;或者是在检测到即将发生抢购活动前几秒钟内完成必要的准备工作[^3]。 --- ### 优点分析 - **扩展性强**:借助于水平分割技术,很容易向现有架构里加入新的成员而无需停机维护,极大地提了吞吐和服务质。 - **容错能力强**:即使个别组件失效也不会影响整个网络的功能正常运转,因为剩余单元仍然维持着对外界的服务接口不变。 - **效能表现**:经实践证明,在合理规划的前提下,Redis集群能够在极短时间内响应海用户的实时需求,展现出卓越的速度优势。 --- ### 缺点探讨 - **复杂度上升**:相较于单体部署方式而言,构建和管理一个主机互联环境无疑增加了运维人员的工作负担和技术门槛。 - **一致性挑战**:由于存在跨地域复制延迟等因素的影响,难以做到强一致性的全局视角更新通知机制,有时会出现短暂的数据不匹配状况。 - **成本投入加大**:为了支撑更大规模的应用场景,企业往往需要采购更的硬件设施以及支付额外的人力物力开销用于保障稳定性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值