live-forum/server/webapi/LiveForum/ls/API请求压力分析.md
2026-03-24 11:27:37 +08:00

10 KiB
Raw Blame History

小程序API请求压力分析报告

一、用户进入小程序到刷帖子的完整请求流程

场景1用户首次打开小程序未登录/已登录但首次打开)

阶段1应用启动App.vue

  • onLaunch()
    • 无HTTP请求仅读取本地存储token

阶段2首页加载pages/index/index.vue

  • onLoad() - 3个请求

    1. RefreshToken - 刷新Token如果有token
    2. GetStreamerCategories - 获取主播榜单分类列表
    3. GetAppConfig - 获取App配置信息
  • getCategories()成功后自动触发 4. GetHomeRankings - 获取首页主播榜单前9名

  • onShow() - 3个请求与onLoad并行或稍后执行 5. GetBanners - 获取轮播图 6. GetLiveStreamers - 获取直播中主播列表 7. GetUserInfo - 获取用户信息(如果已登录)

首页总请求数7个请求


阶段3切换到社区页面刷帖子pages/community/community-page.vue

  • onLoad() - 1个请求 8. GetPosts - 获取帖子列表第1页10条

  • onShow() - 可能的额外请求

    • 如果shouldRefresh=true(登录后),会再次调用GetPosts(通常不触发)

社区页首次加载1个请求


场景2用户已登录且不是首次打开token有效

首页加载时:

  • RefreshToken 可能会成功或失败,但仍会发送请求
  • 其他请求不变

二、请求统计汇总

从进入小程序到首次看到帖子列表

阶段 请求数量 说明
应用启动 0 仅本地存储读取
首页加载 7 3个onLoad + 1个自动触发 + 3个onShow
社区页加载 1 获取帖子列表
总计(最少) 8个请求 未登录状态
总计(已登录) 8个请求 已登录状态(相同)

三、刷帖子操作产生的请求

下拉刷新

  • GetPosts - 1个请求重置PageIndex=1

上拉加载更多

  • GetPosts - 1个请求PageIndex++

点击查看帖子详情

  • GetPostDetail - 1个请求获取帖子详情
  • GetPostComments - 1个请求获取评论列表每页10条

查看一个帖子详情2个请求


四、不同场景的请求压力分析

场景A用户只浏览首页不进入社区

  • 请求数7个
    1. RefreshToken
    2. GetStreamerCategories
    3. GetAppConfig
    4. GetHomeRankings
    5. GetBanners
    6. GetLiveStreamers
    7. GetUserInfo已登录时

场景B用户从首页进入社区并刷帖子完整流程

  • 首次加载8个请求 1-7. 首页的7个请求 8. GetPosts社区页

  • 下拉刷新:+1个请求 9. GetPosts

  • 上拉加载假设加载3次+3个请求 10. GetPosts第2页 11. GetPosts第3页 12. GetPosts第4页

总请求数12个请求(如果用户只浏览列表不点详情)


场景C用户浏览并点击查看帖子详情

  • 浏览3个帖子详情+6个请求 13-14. 帖子1详情 + 评论 15-16. 帖子2详情 + 评论 17-18. 帖子3详情 + 评论

总请求数18个请求


五、服务器压力估算

假设条件

  • 1000个用户同时进入小程序
  • 所有用户都从首页进入社区并刷帖子
  • 平均每个用户下拉刷新1次、上拉加载2次、查看2个帖子详情

计算过程

每个用户的基础请求:

  • 首页加载7个请求
  • 社区页加载1个请求
  • 下拉刷新1个请求
  • 上拉加载2次2个请求
  • 查看2个帖子详情4个请求2×2

单用户总请求15个请求

1000用户并发

  • 总请求数1000 × 15 = 15,000个请求
  • 如果这些请求在60秒内完成QPS = 15,000 / 60 = 250 QPS

六、API接口压力分布

API接口 单用户请求次数 1000用户请求次数 占比
GetPosts 4 4,000 26.7%
GetPostDetail 2 2,000 13.3%
GetPostComments 2 2,000 13.3%
GetBanners 1 1,000 6.7%
GetLiveStreamers 1 1,000 6.7%
GetHomeRankings 1 1,000 6.7%
GetStreamerCategories 1 1,000 6.7%
GetUserInfo 1 1,000 6.7%
RefreshToken 1 1,000 6.7%
GetAppConfig 1 1,000 6.7%

压力最大的接口GetPosts帖子列表


七、优化建议

1. 缓存策略

  • GetAppConfig配置信息变更频率低可缓存24小时
  • GetStreamerCategories分类列表变更频率低可缓存1小时
  • GetBanners轮播图可缓存30分钟

2. 请求合并

  • 首页的某些请求可以合并为一个接口,减少请求数

3. 分页优化

  • GetPosts接口增加缓存相同页码的请求可短时间缓存5-10秒

4. 懒加载

  • 用户未点击进入社区页时,可以不预加载帖子数据

5. 预加载策略

  • 帖子详情页的评论可以延迟加载,先加载帖子详情

八、关键数据总结

最小请求数(用户仅进入首页)

7个请求

典型请求数(用户进入社区并浏览)

12-15个请求(包含下拉刷新、上拉加载、查看详情)

峰值请求数(重度用户)

20+个请求(多次刷新、加载、查看多个详情)

服务器压力1000并发用户

  • 峰值QPS250+
  • 主要压力GetPosts接口占26.7%
  • 建议:重点优化帖子列表查询性能

九、注意事项

  1. Token刷新RefreshToken可能在后台静默执行不影响用户体验但会产生请求
  2. 重复请求onShow可能会重复触发某些请求需要注意去重
  3. 网络失败重试:网络失败时的重试机制会增加请求数
  4. 图片加载帖子列表中的图片加载不计入API请求但会增加服务器带宽压力

十、服务器压力与并发数分析

10.1 服务器配置

  • 业务服务器4核8G × 1台
  • 数据库服务器4核8G × 1台
  • 数据库连接池最大100个连接

10.2 单请求性能分析

高复杂度接口:

  • GetPosts150-300ms7-8个数据库查询
  • GetPostDetail100-200ms5-6个数据库查询
  • GetPostComments80-150ms2-3个数据库查询

中等复杂度接口:

  • GetHomeRankings50-100ms
  • GetLiveStreamers50-100ms

低复杂度接口(可缓存):

  • GetBanners20-50ms未缓存/ 5-10ms缓存
  • GetStreamerCategories20-50ms未缓存/ 5-10ms缓存
  • GetAppConfig20-50ms未缓存/ 5-10ms缓存
  • GetUserInfo30-60ms
  • RefreshToken20-40ms

10.3 服务器性能指标

业务服务器4核8G

  • 安全运行QPS4000-6000 请求/秒50%负载)
  • 理论峰值QPS8000-12000 请求/秒

数据库服务器4核8G

  • 安全运行QPS1000-2000 查询/秒50%负载)
  • 连接池限制100个连接
  • 理论峰值QPS1500-2000 查询/秒

10.4 并发数计算

单用户请求分析:

  • 首页加载7个请求平均200ms
  • 社区页加载1个请求平均200ms
  • 下拉刷新1个请求平均200ms
  • 上拉加载2次2个请求平均200ms
  • 查看2个详情4个请求平均300ms
  • 单用户总请求15个请求
  • 单用户平均响应时间约250ms/请求

基于业务服务器计算:

最大并发用户数 = (业务服务器QPS × 单用户平均响应时间) / 单用户请求数
              = (4000 × 0.25) / 15
              ≈ 66-100 个并发用户(保守估计)

基于数据库服务器计算:

数据库连接池100个连接
单连接处理能力10-20 查询/秒
数据库总QPS100 × 15 = 1500 查询/秒

单用户数据库查询数约30-50个15个API × 平均2-3个查询/API
最大并发用户数 = 1500 / (40 / 0.25) ≈ 9-10 个(过于保守)

实际考虑查询优化和缓存后约100-200个并发用户

10.5 压力测试结果预估

说明QPS = Queries Per Second每秒请求数数据库QPS = 每秒数据库查询数

计算方式:

  • 假设每个并发用户完成15个请求首页7个 + 社区页1个 + 刷新1个 + 加载2个 + 详情4个
  • 单用户平均响应时间250ms/请求
  • 单用户完成所有请求时间约3-4秒考虑请求并行
  • QPS = (并发用户数 × 单用户请求数) / 单用户完成时间
并发用户数 QPS每秒 数据库QPS每秒 CPU使用率 内存使用率 状态
100 375-500 937-1250 10-20% 20-30% 轻松
150 562-750 1405-1875 20-30% 30-40% 良好
200 750-1000 1875-2500 30-40% 40-50% ⚠️ 适中
300 1125-1500 2812-3750 50-70% 60-70% ⚠️ 压力大
400 1500-2000 3750-5000 70-90% 70-80% 接近极限
500 1875-2500 4687-6250 90-100% 80-90% 可能过载

上述QPS为峰值QPS实际运行中由于用户操作时间分散平均QPS会低于峰值

10.6 最大并发数结论

保守估算推荐100-150个并发用户

  • 保证稳定运行
  • 响应时间可接受(<300ms
  • 资源使用率合理(<50%

理论峰值300-400个并发用户

  • 需要优化(缓存、索引)
  • 可能响应时间延长500ms+
  • 资源使用率较高70-90%

当前架构瓶颈:

  1. 数据库连接池100个连接主要瓶颈
  2. 数据库CPU4核处理能力
  3. GetPosts接口复杂度:多表查询

10.7 优化建议

短期优化提升50-100%

  • 启用Redis缓存GetAppConfig、GetBanners、GetStreamerCategories
  • 优化数据库索引T_Posts、T_PostImages、T_Likes等
  • 增加数据库连接池大小到150-200

中期优化提升2-3倍

  • 增加1-2台业务服务器负载均衡
  • 数据库读写分离
  • GetPosts接口查询优化视图或存储过程

详细分析请参考: 服务器压力与并发数分析.md


文档生成时间: 2025-01-XX
分析基于代码版本: 当前代码库版本