客户介绍
吉祥航空是国内知名的航空公司之一,2021年运输旅客超1,400万人次,总运输旅客超1.3亿人次。
建设背景
近期吉祥航空“925周年庆”活动,集团推出了旅客喜爱的一系列营销产品,比如“主题卡”、特价机票秒杀等,预估活动页面流量将迎来数倍增长。性能测试团队为解决容量评估、性能摸底的问题,引入了数列科技全链路压测平台Takin来解决当前的稳定性痛点。
场景挑战及解决方案
挑战一:秒杀下单场景下,单条数据库存更新耗时太久如何解决?
现有A商品库存500件,在秒杀场景下,为了不出现超卖的情况,在SQL中加了库存判断,这样库存可以保证不出现超卖情况,但是SQL的执行性时间变长了,单次更新时间接近3s。
解决方案:主要考虑在保证不超卖的前提下,利用提升接口效率。由于临近活动开始,可选择代码量改动较小的方案——把库存缓存在Redis中,利用redis原子操作的特性,把库存扣减操作放在redis中而不修改数据库,把修改数据库的行为放在支付成功后。
应用效果:高并发压测下,3000库存可以在1分钟内正常扣除,每秒至少可以正常完成50笔下单操作,并且未出现超卖现象。
挑战二:测试环境有限的资源下,如何将接口从响应时间13s优化200ms以内?
会员购买优惠券后,会有优惠券列表查询接口,此接口返回所有优惠券信息以及优惠券的部分详情内容,实测用户在有14张券的情况下,该接口单次请求耗时超过10s。
解决方案:利用Takin的探针定位功能,对系统做定位分析后发现主要问题为两点——数据库索引未生效或未添加、代码中循环多次执行同一个sql。在代码中进行数据预处理,只执行1次数据库操作,在命中索引前提下,使用in替代多次数据库查询来解决。
应用效果:用户下单后查询订单详情操作从单次请求耗时10s以上降低到200ms以内,性能50倍以上,极大程度上提升了在秒杀场景下的用户体验。
挑战三:代码发布到线上环境,如何保证活动开始无故障?
登录接口的实际容量、优惠券的购买,测试环境功能、性能问题解决之后,发布生产,进行生产压测,压测过程中频繁出现RT超过60s情况。
解决方案:利用Takin的探针定位功能,对系统做定位分析后发现,代码中mongoDB保存相关信息超时,导致所有线程卡在mongoDB请求中;同时,新扩容的机器访问第三方接口防火墙未开,导致所有请求卡在等待网络响应上。后问题被逐一解决。
应用效果:提前演练规避掉了以上2个生产故障,保障了活动当天可以稳定运行。
客户收益
此次“925周年庆营销活动”稳定性保障,吉祥航空基于Takin的全链路压测能力,在测试环境、生产环境,提前发现、累计定位了30+个性能问题,包括代码层、sql层、基础配置、网络等相关问题。经过优化后,性能有了很大提升,提前排除了隐患风险。同时925活动也已经顺利经过了吉祥航空APP用户检验,线上0性能故障。
本文来自投稿,不代表TakinTalks稳定性技术交流平台立场,如若转载,请联系原作者。