# 《Seckill秒杀系统》第121章:全链路压测落地方案实施

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:掌握全链路压测在实际项目中的落地方案,了解常用的全链路压测工具,重点掌握全链路压测方案的实施流程,并能够结合自身实际项目进行思考,将全链路压测的思想灵活应用到自身实际项目中。

大家好,我是冰河~~

掌握全链路压测的场景与核心流程后,结合自身实际项目思考,确定要对系统进行全链路压测后,就需要遵循一定的原则,在压测过程中采用一定的压测策略。掌握这些全链路压测的知识后,我们就需要对秒杀系统进行全链路压测了。我也相信,可能大部分小伙伴对压力测试接触的不对,全链路压测可能接触的就更少了。

# 一、前言

我们开发的秒杀系统性能到底如何?TPS、QPS,并发用户数到底如何?1000?2000?还是更多?这些都不能由我们拍脑袋决定,我们需要由数据来说话。相信大家学习秒杀系统这么久了,已经迫不及待的想对秒杀系统进行压测了。

# 二、本章诉求

对秒杀系统进行压测,了解整个压测的执行流程和落地方案,通过压测,了解秒杀系统的性能瓶颈,并对秒杀系统进行优化。重点掌握压测在实际项目中的落地方案,并能够将压测的流程和实施过程灵活应用到自身实际项目中。

注意:本章内容将作为专栏的作业,大家根据本章的内容,结合整个专栏的内容和源码,搭建好运行环境,对秒杀系统真正动手进行压测,检验下自己的学习成果。

# 三、确定压测目标

在正式对秒杀系统进行压测之前,我们需要确定好压测的接口和压测的目标,在秒杀系统中,我们需要对获取秒杀活动列表接口、获取秒杀活动详情接口、获取秒杀商品列表接口、获取秒杀商品详情接口和秒杀下单接口进行压测。

(1)获取秒杀活动列表接口

  • 接口链接:http://{ip:port}/seckill-activity/activity/seckillActivityList。
  • 操作:读数据。
  • 目标QPS:单机1000,集群100000(假设值)

(2)获取秒杀活动详情接口

  • 接口链接:http://{ip:port}/seckill-activity/activity/seckillActivity。
  • 操作:读数据。
  • 目标QPS:单机1000,集群100000(假设值)

(3)获取秒杀商品列表接口

  • 接口链接:http://{ip:port}/seckill-goods/goods/getSeckillGoodsList。
  • 操作:读数据。
  • 目标QPS:单机1000,集群100000(假设值)

(4)获取秒杀商品详情接口

  • 接口链接:http://{ip:port}/seckill-goods/goods/getSeckillGoods。
  • 操作:读数据。
  • 目标QPS:单机1000,集群100000(假设值)

(5)秒杀下单接口

  • 接口链接:http://{ip:port}/seckill-order/order/saveSeckillOrder。
  • 操作:写数据。
  • 目标QPS:单机1000,集群100000(假设值)

确定好哪些接口需要压测和压测的目标后,接下来,就需要准备压测的环境了。

# 四、准备压测环境

准备压测环境时,需要对环境进行区分,流量染色与数据隔离,关闭秒杀系统的限流、将压测流量添加到白名单、对必要的功能进行挡板设置、做好监控准备。

(1)对环境进行区分

一般情况下,会将程序的运行环境分为开发环境、测试环境、预发布环境和生产环境。在对系统进行压测时,以生产环境最佳,能够真正测试出生产环境的系统性能,但是,在生产环境进行压测需要做好流量和数据的隔离操作,不要影响到正常流量和用户的正常数据。

如果不具备在生产环境做压测的条件,可以在预发布环境进行压测,但是预发布环境,虽然天然与生产环境隔离,能够做到业务隔离、数据隔离,风险也是可控的,但是在预发布环境上很难构建出与生产环境一样的业务场景和系统环境,并打通全链路的数据。

还一个需要注意的就是:在生产环境进行压测,需要做好隔离工作,并且要在流量低峰期进行。

(2)流量染色与数据隔离

在生产环境进行压测时,需要做好流量染色和数据隔离工作。一种非常简单的流量染色方式就是在请求头中加特定的标识,请求进入系统,业务系统和中间件能够识别出流量标识,此时根据流量标识对业务进行逻辑隔离和数据隔离。在数据库层面我们可以在上产环境的数据库中创建影子表,影子表的表结构与实际业务数据表相同,在表名称上可以添加一个test_前缀,或者其他的标识,以便于和真实业务表做区分。在缓存层面,同样可以在对应的缓存KEY的基础上,添加一个test_前缀。

压测开始前,我们要提前生成影子表,并且将必要的数据导入到影子表中。

进行压测时,如果系统检测到流量染色的标签,则将数据库的读写操作路由到影子库,也就是以test_开头的数据表中,对于缓存的读写操作也路由到以test_开头的KEY上。

当压测结束后,将影子表中的数据清空即可。

这里,需要注意的是:无论是流量染色,还是数据隔离,我们都需要对秒杀交易链路上的业务系统和中间件进行改造,要支持正常流量和压测流量同时进入系统而不会造成流量和数据混乱。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码