高并发功能通用设计方案

838 阅读3分钟

一. 明确目标

分类型

  • 突发流量性
  • 稳定流量性

定指标

  • 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 容量
  • 集群性能分析
  • 网络带宽分析

可用性

稳定性建设 -高可用系统建设的必备知识-上

稳定性建设 -高可用系统建设的必备知识-下

预热

  • 应用预热

www.cnblogs.com/crazymakerc…

  • 缓存预热

定时任务

手动

注意: 在缓存失效之前刷新缓存 防止数据击穿到db

三 性能压测

压测视频 www.bilibili.com/video/BV1rz…
指标解读

zhuanlan.zhihu.com/p/503496516

zhuanlan.zhihu.com/p/506420025