|爱奇艺全链路压测探索与实践
背 景
爱奇艺除了每天都为数以亿计的用户提供优质的视频服务 , 同时还有体育、直播、文学等业务服务于更多的圈层用户 , 海量的业务几乎每天都在进行营销活动 , 由此带来的流量随时可能会给我们的服务引入不确定性 。 爱奇艺支付团队为各业务线提供全面的收付款服务 , 保障用户的付费体验 , 团队除了保障服务的稳定性外 , 还要应对随时可能爆发的流量挑战 。 对于支付系统来说做好准确的容量评估和预案是非常重要的 , 全链路压测在这方面提供了有力保障 。
全链路压测是基于生产环境 , 模拟业务高峰时的海量请求 , 对整个系统链路进行压力测试 , 继而进行有效的容量评估和系统调优 。 因为支付业务对数据敏感同时业务复杂 , 使得系统间调用链路难以准确全面评估 , 实施压测比较困难 , 在没有实施全链路压测前 , 我们经常会遇到以下问题:
- 生产环境流量构成复杂 , 单机压测结果难以有效评估生产环境容量;
- 流量转化评估与实际用户行为不匹配 , 导致预案不能达到预期效果;
- 公共资源/服务很难在局部压测中暴露瓶颈 , 需要真实的高峰流量来验证;
- 链路容量不能对齐导致整体受限于短板服务 , 同时也产生了严重的资源浪费 。
问题探索与方法实践
本文插图
开展全链路压测我们主要从几下方面进行了探索与实践:
- 核心链路梳理 , 明确压测目标链路和分支链路 , 排除压测风险;
- 压测环境准备 , 压测全链路能够透传压测标识并正确处理压测流量;
- 流量构造 , 结合真实的数据和需求策略分析制定压测流量模型;
- 执行与保护 , 实施前做好业务验证 , 按计划实施 , 做好监控和复盘 。
核心链路梳理将多个业务线串联到一起 , 在实施过程中 , 我们由各业务团队梳理自己的核心链路 , 明确对下游服务的依赖 , 同时梳理出旁路依赖 。 将各业务线的核心链路进行汇总 , 得到最终的压测全链路 。 核心链路中可能会耦合外部服务但又不能参与压测 , 比如支付系统依赖的第三方渠道 。 在实践中我们通过自建渠道mock服务支持了多种渠道的支付请求 , 同时模拟渠道的支付成功率 , 支付回调延迟 , 支付通知等 , 形成支付全链路的闭环 。
旁路依赖的梳理也是重要的一环 , 准确全面的梳理是后续顺利进行压测的保障 。 旁路依赖根据实际业务情况评估 , 如风控系统我们进行了mock , 账务服务通过消息组件实现了服务降级 。
在与票务业务的一个抢票场景做链路梳理后 , 核心点主要涉及用户的登录鉴权、票务活动、出票、收银台、支付和通知6个服务 , 对风控、推荐、push等旁路依赖评估后做了降级处理 , 对支付渠道和票务渠道的重要服务指标进行mock , 最终形成一个业务闭环的核心链路 , 如下图:
本文插图
【|爱奇艺全链路压测探索与实践】
2 压测环境准备
核心链路依赖的环境除了业务的服务器外还涉及数据库、消息、缓存、日志等 , 在这一阶段我们主要对以下几点进行了考虑和支持:
- 压测标识透传
- 存储数据隔离
- 消息
- 水位
核心链路上可能会有很多技术组件要支持压测流量 , 原则和方案都是类似的 , 根据实际业务情况做好数据隔离即可 。 如Redis可以使用影子key或者影子集群 , MongoDB使用影子collection ,ElasticSearch使用影子索引 , 日志新建影子目录 。 下图是爱奇艺的支付系统在全链路压测环境准备好后 , 核心链路对压测流量的处理情况:
本文插图
3 流量构造
本文插图
单接口压测时我们会提前生成好一批符合接口规范的数据备用 , 但这种数据过于单一 , 并不符合真实的业务场景 。 比较理想的方式是在网关层抓取生产环境的日志数据进行二次处理后对流量进行回放 。 我们在初期的探索阶段并没有实现这种方式 , 我们对已有的数据和接口调用量进行分析 , 结合业务策略对数据模型进行调整 , 得到最终的压测模型 。 例如在支付业务的全链路压测中 , 我们通过数据分析得出用户在生产环境中选择各支付方式的占比、各服务调用占比 , 同时结合业务策略对用户购买指数的影响 , 微调收银台转化率 , 最终确定下单服务、渠道通知、订单查询等服务调用量配比模型 。
4 压测执行与保护
本文插图
执行压测前 , 对全链路进行业务和环境验证是必不可少的 , 各业务确保压测旁路已做好降级和数据隔离 , 保证压测流量不影响正常业务数据 。
监控是全链路压测实施过程中评估系统健康的重要手段 , 帮助我们发现问题 , 及时止损 。 在压测过程中我们事先准备了以下维度的指标:
- 核心链路服务调用量 , 成功率 , 耗时;
- 消息积压监控 , redis水位、命中率 , 数据库负载等性能指标;
- 机器的基础指标 。
压测实践与结果
全链路压测能力打通后 , 我们主要基于以下两个方面实施了全链路压测:
1 业务容量验证
支付团队与直播、票务等团队在营销、抢购活动中进行全链路压测 , 以满足业务需求容量为目标 , 有效定位全链路中的短板服务 , 通过扩容、异步化、降级等方式处理 , 保证了全链路的容量达到预期目标 。 同时对限流、降级策略进行验证 , 保证业务在高峰时的可用性 。
压测时支付系统提供多种支付方式的支持 , 渠道mock服务提供贴近真实的拉起延迟、订单成功率mock、同步响应、异步服务器通知、通知延迟等场景 , 形成全链路压测闭环 。
2 系统极限压测
支付系统本身也是一个结构复杂的系统 , 收银台、账务、风控、认证、渠道等相关服务都由相关团队维护 , 任何一个环节保护不到位都可能影响整体系统的稳定性 , 因此对支付系统的全链路压测是很有必要的 。
实施中主要拆分为两个方向:
- 虚币消费压测
在起初的压测中 , 我们发现虚币支付的TPS只能达到设计容量的60% , 通过对链路的耗时分析发现在订单号生成服务出现了部分降级 , 拉高了整体的RT 。 进一步分析发现是分布式订单号的自增序列依赖redis , 在与redis的交互中出现抖动 , 与中间件团队确认后最终定位到是RDB持久化时fork子进程引起了服务停顿 。 根据当前场景的需求 , 我们关闭了RDB , 配合降级策略的优化 , 几轮压测调优后支付系统的TPS基本接近目前部署服务的可负载容量极限 。
- 混合压测
全链路压测需要跨业务部门合作 , 每一次压测都要做好事前计划:目标是什么 , 需要哪些数据衡量 , 需要哪些预案 , 压测流量策略如何设置和执行等 , 同时做好复盘和结果跟进 , 保障压测在有序可控的前提下实施 。
未来规划
在整个全链路压测实践中涉及到的需求点很多而且分散 , 如数据模型、流量调度、监控跟踪、性能分析等 , 很多细节处于探索阶段 。 后续结合更多的实践经验 , 进行统一规划形成一站式的解决方案 , 降低全链路压测的接入难度和实施成本 。
对于涉及支付系统的全链路压测 , 流量来自上游业务 , 对支付方式多样性的构建是有一定成本的 , 后续计划支持将上游单一流量自动配比为多样化的支付请求 。 支付相关业务对数据比较敏感 , 提供支付压测数据报告给上游业务以及账务等相关业务 , 可以在必要时满足核对需求 。
技术原创及架构实践文章 , 欢迎通过公众号菜单「联系我们」进行投稿 。
高可用架构
改变互联网的构建方式
推荐阅读
- |综艺讯 | 爱奇艺《潮流合伙人2》即将上线《追光吧哥哥》官宣阵容
- IT之家|OPPO发布全链路色彩管理系统:全链路支持10bit图片与视频拍摄
- 又一黑科技,OPPO发布全链路色彩管理系统,用机体验再次升级
- OPPO全链路色彩管理系统全解析,原来对手机提升这么大?
- 爱奇艺AR内容亮相OPPO未来科技大会2020 全息舞台带来沉浸式观赏体验
- 奇艺|爱奇艺Q3在线广告环比增16% 品牌广告呈积极增长趋势
- 营收|爱奇艺三季度营收72亿元同比下降3%,净亏损为12亿元同比收窄
- 中新经纬|爱奇艺第三季营收72亿,会员费贡献过半!你掏钱了吗?
- 新浪网|爱奇艺高管解读财报:调价措施不会影响到中期长期会员的发展
- 提价|爱奇艺会员涨价了!行业有望跟进 良性差异化竞争可期
