一. 明确目标
分类型
- 突发流量性
- 稳定流量性
定指标
- QPS 天/时/分/秒
- RT 响应时间 99 95 90
- 可用性 在高并发情况下 要保证服务不崩溃
二. 定方案
链路分析
a. 分析核心链路 将可异步化处理的 异步化处理
业务分析:
分析当前非主链路的功能或对时效性不高的功能,全异步执行 需注意数据一致性
高并发框架设计实例
redis 异步备份
rocketMQ 事务 延迟消息
各种框架中的监控指标记录
b. 分析核心链路 将可并行处理的请求 将阻塞变为非阻塞 -注意真异步和伪异步
伪异步 与 纯异步
异步调用目的在于防止当前业务线程被阻塞。
但是 Future 阻塞式异步 属于 伪异步
-
伪异步 就是 将任务包装为Runnable/ Callable 作为Biz业务线程(被调用线程)的任务去执行,并调用方阻塞等待,当前Biz 线程不阻塞;
-
纯异步为回调式 异步。他们的区别不在于是否将请求放入另一个线程池执行,而在于是否有线程阻塞等待Response。
业务分析:
异步任务编排,全链路异步化
高并发框架设计实例
Redis io 多路复用
Spring Gateway
Rocketmq KafKa 异步发送信息
c. 分析链路中可以预处理信息
业务分析:
业务正常处理可能需要调用多个系统数据和多个表数据 提前将数据聚合 只需查询一次 各种预热
高并发框架设计实例
RocketMq 文件预分配 MappedFile 预热
d. 分析链路中可以合并的请求,批量的请求
业务分析:
高并发情况下相同的请求可以共用一个缓存或DB结果
可以批量操作的都尽可能批量操作,因为批量操作可以减少io消耗
高并发框架实例
WAL
MYSQL 的各种日志文件
Rocketmq KafKa CommitLog
Nacos 源码请求过来会先放入延迟队列合并一段时间的请求 过滤了多数相同请求
kafka RocketMq 批量发送信息
缓存
- 本地缓存
- redis缓存
存储选型
参数调优
- 线程池参数优化
别再纠结线程池池大小、线程数量了,哪有什么固定公式 | 京东云技术团队 - 掘金
- tomcat配置调整
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数,默认为100
accept-count: 100
threads:
# tomcat最大线程数,默认为200
max: 1000
# Tomcat启动初始化的线程数,默认值10
min-spare: 200
max-connections: 20000
- jvm 参数优化 gc频率 gc停顿时间
容量分析
- redis 缓存容量
- 本地缓存容量
- mysql 容量
- 集群性能分析
- 网络带宽分析
可用性
预热
- 应用预热
- 缓存预热
定时任务
手动
注意: 在缓存失效之前刷新缓存 防止数据击穿到db
三 性能压测
压测视频 www.bilibili.com/video/BV1rz…
指标解读