大项目复盘4|青训营笔记

111 阅读4分钟

这是我参与「第五届青训营」笔记创作活动的第17天。

今天主要针对大项目已经实现的东西进行复盘,并对功能测试做出详解。

功能测试

测试用例表格

产品功能验收清单

功能验收清单中包含了抖音项目方案中提及的各个模块功能。主要测试了主要业务流程,一些较复杂链路(如多次点赞取消点赞查看点赞登录用户总数等)虽然没有写在测试用例中,但也在实际开发中进行了测试。

链路追踪

微服务调用关系图:

链路调用时间图(一小时内,为了方便观察只调用了用户信息):

一次用户信息调用的链路耗时详情:

性能测试

测试准备

测试环境:

  1. (x86_64 AMD 8核16线程

  1. 微服务通过分配端口运行在同一主机下
  2. 数据库,缓存,MQ,链路追踪通过 docker 运行在同一主机下

测试方案:

  • 使用 Hertz 提供的 pprof 扩展,对 Hertz 项目进行性能分析(通过火焰图分析 CPU 使用情况);
  • 利用 Apifox 自动化测试模块书写测试用例和测试套件,根据多次循环得到较平稳的延迟时间,生成测试结果;
  • 利用 Jemeter 测试多并发场景下的接口性能情况。

测试结果

*注:测试时间有限,这里仅针对部分场景和链路进行了测试。

基准测试

接口(功能)测试:

混合测试:

并发测试

在并发测试中,我们优先处理上述基准测试中响应最慢,数据最多,但同时也是最核心的视频流部分:

我们以3000毫秒为阙值,观察并发量上限:

样本平均最短最长
视频流接口100289625273163

测试结果表明,在并发量到达 50 的时候会接近 3000 响应延时。

如果在高并发情况下,当前服务器配置和服务处理方案是不够用的。需要进行优化(详情见 4.3)

负载测试 / 压力测试

用户登录 + 查看信息业务链路为例:

对应响应时间测试结果如下:

修改上述配置,长时间压力测试(100分钟,固定20并发):

对应pprof火焰图如下:

可以看到,大部分的 CPU 占用都在主要业务上,同时还有部分 CPU 占用在 jaeger 链路追踪。考虑到资源利用问题,可以在上线版本优化 jaeger 链路追踪。

性能优化

热门视频优化

短视频app最核心的部分便是视频流的获取,但是目前我们的项目视频流获取响应比较慢。主要原因在于视频流涉及到的业务模块和响应记录链路长度较长,容易产生更多的记录查询:

*tips: 以上为 2 -> 30 并发量步进。

由于微服务粒度较细,这里的视频流请求时会分别去调用用户,评论,点赞等多个微服务获取数据。

我们可以采取对热门服务(这里的热门服务定义需要通过合理的决策和规则。这里假设一个视频在 ns 内访问了100次以上,那么我们称该视频为热门视频一段时间)进行缓冲来优化响应。目前采用缓冲策略为加入到 Redis 中。

由于在进行压力测试时请求参数没有设置变量,所以响应变化曲线尤为明显:

可以看出,当视频被识别为热门视频后,其响应速度立刻提升。

发送聊天信息优化

我们对聊天消息进行并发测试:

总体测试背景样本平均响应异常%
125并发,100线程数,2s完成,循环80072260%
250并发,250线程数,5s完成,循环172263990%
3500并发,2500线程数,5s完成25006280%
41000并发,5000线程,5s完成500055710.48%
5100并发,5000线程,5s完成500070250%

这里可以看到,当我们高并发发送信息时,可能会导致响应时间急速上升,并且出现异常量。

我们这里可以使用 RoketMQ 集群来处理高并发场景。

同样是处理 1000并发,5000线程,5s完成 的场景,我们加入 RocketMQ 进行削峰处理,并且加入出错后重新消费机制。

观察此时的汇总报告:

响应折线图:

可以看到这里的响应时间降低,使得网关层可以迅速应付高流量,而在消息队列做平滑处理。

*tips: 在高并发场景下,服务收到的请求数会缺失,导致最终的数据库添加条数少于5000,问题来源还在探究。