背景:高并发
PV:PageView综合浏览量;
QPS:每秒请求查询数量
响应时间:服务器响应时间
吞吐量:单位时间内处理请求的数量
高并发:
1.物理角度(扩容)
扩容是目前效果最明显的增加并发量技巧之一
(水平扩容)单体数量的增加,伴随着数据库的访问限制成为了瓶颈
-->服务的拆分
2.提高接口并发能力(提高接口响应速度,缩短接口的响应时间)
- 缓存(把数据存入缓存之中,提高接口响应速度)
- 动静分离(静态资源放到Nginx中,Nginx可以当做静态web资源服务器)1.链路短2.不占用网络带宽,提高并发量
- 服务降级(业务的策略降级,返回次一级的,将系统资源留给核心业务)
3.提高系统可用性--限流
- 可用性:接口在一年内能够正常对外提供服务的时间比例
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.2-android</version>
</dependency>
网关redis==>1.导入依赖
2.配置文件配置
1.查询库存不足的时候redis存入一个标记
2.网关层查询一下redis标记(业务限流)
3.流量削峰
3.1验证码
防止恶意请求
3.2令牌桶算法
通过令牌发放数量==接收请求数量
接收请求=滴水
处理=漏水
桶满了=拒绝请求
令牌桶:处理突发请求,处理能力根据令牌数量决定 √
漏桶算法:恒定的处理速度
对比:
互联网领域通常以突发情况较多,令牌桶算法较多
Google提供的Guava工具包的RateLimiter进行限流
队列泄洪
利用线程池来队列泄洪 (限流)
controller包下-,一个木桶,在需要令牌的请求里,acquire一下
(流量限流+业务泄洪)
1.导入guava包下的RateLimiter
赋值
2.使用(总体限流)
当没有令牌的时候睡眠1分钟/100的时间,唤醒后刚好尝试一个令牌
3.固定线程池
4.100个线程表示最多同时一百个线程同时执行
二者配合,因为令牌是一秒一百个,而处理速度可能短于令牌发放时间;
------------------------------