你在使用哪种编程语言?快来投票,亲手选出你心目中的编程语言之王 了解详情
写点什么

智能支付稳定性测试实战

2020 年 2 月 27 日

智能支付稳定性测试实战

背景

美团支付承载了美团全部的交易流量,按照使用场景可以将其分为线上支付和智能支付两类业务。线上支付,支撑用户线上消费场景,处理美团所有线上交易,为团购、外卖、酒店旅游等业务线提供支付能力;智能支付,支撑用户到店消费场景,处理美团所有线下交易,通过智能 POS、二维码支付、盒子支付等方式,为商家提供高效、智能化的收银解决方案。其中,智能支付作为新扩展的业务场景,去年也成为了美团增速最快的业务之一。


面临的挑战

而随着业务的快速增长,看似简单的支付动作,背后系统的复杂度却在持续提升。体现在:上层业务入口、底层支付渠道的不断丰富,微服务化背景下系统的纵向分层、服务的横向拆分,还有对外部系统(营销中心、会员中心、风控中心等)、内部基础设施(队列、缓存等)的依赖也越来越多,整条链路上的核心服务节点超过 20 个,业务复杂度可想而知。



此外,技术团队在短时间内就完成了从几个人到近百人规模的扩张,这也是一个潜在的不稳定因素。曾经在一段时间内,整个系统处在“牵一发而动全身”的状态,即使自身系统不做任何发版升级,也会因为一些基础设施、上下游服务的问题,业务会毫无征兆地受到影响。


痛定思痛,我们对发生过的线上问题进行复盘,分析影响服务稳定性的原因。通过数据发现,72%的严重故障集中在第三方服务和基础设施故障,对应的一些典型事故场景,比如:第三方支付通道不稳定、基础设施(如消息队列)不稳定,进而导致整个系统雪崩,当依赖方故障恢复后,我们的业务却很难立即恢复。



解决方案

基于这些问题,我们开展了稳定性建设专项,目的很明确:提升服务的可用性。目标是逐步将系统可用性从 2 个 9 提升到 3 个 9,再向 4 个 9 去努力。这个过程中最核心的两个策略:柔性可用,意思是尽可能保证核心功能可用,或在有损情况下尽可能保证核心用户体验,降低影响;另一个是快速恢复,即用工具或机制保证故障的快速定位和解决,降低故障修复时间。


围绕这两个策略,在稳定性建设中的常见操作:限流、熔断降级、扩容,用于打造系统的柔性可用;故障响应 SOP、故障自动处理,用于故障处理时的快速恢复。而 QA 的工作更侧重于对这些“常见操作”进行有效性验证。基于经验,重点介绍“三把利剑”:故障演练、线上压测、持续运营体系。



故障演练的由来

举个真实的案例,在一次处理某支付通道不稳定的线上问题时,开发同学执行之前已经测试通过的预案(服务端关闭该通道,预期客户端将该支付通道的开关置灰,并会提示用户使用其他支付方式),但执行中却发现预案无法生效(服务端操作后,客户端该支付通道仍处于开启状态)。非故障场景下预案功能正常,故障场景下却失效了。


这就是故障演练的由来,我们需要尽可能还原故障场景,才能真正验证预案的有效性。


故障演练的整体方案

故障演练的整体方案,主要分为三部分:


  • 负载生成模块,负责尽可能还原系统的真实运行场景(要求覆盖核心业务流程)。

  • 故障注入模块,包含故障注入工具、故障样本库(涵盖外部服务、基础组件、机房、网络等各种依赖,并重点关注超时、异常两种情况)。

  • 业务验证模块,结合自动化测试用例和各个监控大盘来进行。



为了更高效地开展故障演练,我们的策略是分为两个阶段进行。首先,针对单系统进行故障演练,从故障样本库出发,全面覆盖该系统所有的保护预案;在此基础上,进行全链路故障演练,聚焦核心服务故障,验证上下游服务的容错性。



故障演练的效果

事实证明,故障演练确实给我们带来了很多“惊喜”,暴露了很多隐患。这里列举三类问题:数据库主从延迟影响交易;基础设施故障时,业务未做降级;依赖服务超时设置不合理、限流策略考虑不足等。



线上压测的由来

面对业务的指数级增长,我们必须对系统可承载的流量做到心中有数。对于 QA 来说,需要找到精准、高效的系统容量评估方法。我们碰到的难点包括:链路长、环节多、服务错综复杂,线下环境与线上差异大等等,基于测试有效性和测试成本考虑,我们决定要做线上压测,而且要实现全链路的线上压测。


线上压测的整体方案

全链路压测的实现方案,与业界主流方案没有太大区别。根据压测流程,首先,场景建模,以便更真实的还原线上系统运行场景;其次,基础数据构造,应满足数据类型以及量级的要求,避免数据热点;之后,流量构建,读写流量构造或回放,同时对压测流量进行标记和脱敏;再之后,压测执行,过程中收集链路各节点的业务运行状态、资源使用情况等;最后,生成压测报告。


基于全链路线上压测方案,可以根据业务需求,灵活地进行单链路压测、分层压测等。更为重要的是,基于压测我们可以进行线上的故障演练,用于更加真实的验证系统限流、熔断等保护预案。



线上压测的效果

通过全链路线上压测,一方面让我们对系统容量做到心中有数,另一方面也让我们发现了线上系统运行过程中的潜在问题,而且这些问题一般都是高风险的。同样列举三类问题:基础设施优化,如机房负载不均衡、数据库主从延迟严重等;系统服务优化,如线程池配置不合理、数据库需要拆分等;故障预案优化,如限流阈值设置过低,有的甚至已经接近限流边缘而浑然不知等等。



持续运营体系的由来

智能支付的稳定性建设是作为一个专项在做,持续了近 3 个月的时间;在效果还不错的情况下,我们从智能支付延伸到整个金融服务平台,以虚拟项目组的方式再次运转了 3 个月的时间。通过项目方式,确实能集中解决现存的大部分稳定性问题,但业务在发展、系统在迭代,稳定性建设必然是一项长期的工作。于是,QA 牵头 SRE、DBA、RD,建立了初步的稳定性持续运营体系,并在持续完善。



持续运营体系的整体方案

下面介绍持续运营体系的三大策略:


流程规范工具化,尽可能减少人为意识因素,降低人力沟通和维护成本。


如:配置变更流程,将配置变更视同代码上线,以 PR 方式提交评审;代码规范检查落地到工具,尽可能将编码最佳实践抽取为规则,将人工检查演变为工具检查。


质量度量可视化,提取指标、通过数据驱动相关问题的 PDCA 闭环。


如:我们与 SRE、DBA 进行合作,将线上系统运维中与稳定性相关的指标提取出来,类似数据库慢查询次数、核心服务接口响应时长等等,并对指标数据进行实时监控,进而推进相关问题的解决。


演练压测常态化,降低演练和压测成本,具备常态化执行的能力。


如:通过自动化的触发演练报警,验证应急 SOP 在各团队实际执行中的效果。


基于以上三个策略,构建稳定性持续运营体系。强调闭环,从质量度量与评价、到问题分析与解决,最终完成方法与工具的沉淀;过程中,通过平台建设来落地运营数据、完善运营工具,提升运营效率。



持续运营体系的效果

简单展示当前持续运营体系的运行效果,包含风险评估、质量大盘、问题跟进以及最佳实践的沉淀等。



未来规划

综上便是智能支付 QA 在稳定性建设中的重点工作。对于未来工作的想法,主要有 3 个方向。第一,测试有效性提升,持续去扩展故障样本库、优化演练工具和压测方案;第二,持续的平台化建设,实现操作平台化、数据平台化;第三,智能化,逐步从人工运营、自动化运营到尝试智能化运营。


作者简介

  • 勋伟,美团高级测试开发工程师,金融服务平台智能支付业务测试负责人,2015 年加入美团点评。


2020 年 2 月 27 日 11:14271

评论

发布
暂无评论
发现更多内容

对不起,我爱你

小天同学

小说 爱情 情感

第三周作业

LEAF

加密与解密

返町

跨云厂商部署 k3s 集群

米开朗基杨

k3s wireguard

你真的了解敏捷吗?听马丁福勒聊敏捷

涛哥

敏捷 数字化转型

常年“佛系”Crysis勒索病毒突然变种 变身黑客工具合辑

360安全卫士

运营系统架构文档

师哥

培训机构出来的程序员常被鄙视,招谁惹谁了

程序员生活志

程序员 程序人生

Free space——区块链加密社交平台新秀之作

Geek_116789

如何写出高质量的代码?(浅谈代码规范、重构、单元测试的重要性)

Nick

单元测试 重构 代码重构 代码规范

英特尔宋继强:坚持科研的长期主义 推动AI向3.0时代跃迁

最新动态

【写作群星榜】6.12~6.19 写作平台优秀作者 & 文章排名

InfoQ写作平台官方

写作平台 排行榜

为什么Web开发人员在2020年不用最新的CSS功能

Geek_Willie

CSS

如何让企业的IT数据运维更有“烟火气”?

博睿数据

数据挖掘 学习 数据中台 运维 大屏可视化

游戏夜读 | 最常见的两种类型

game1night

重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

小傅哥

设计模式 小傅哥 重构 代码优化 责任链模式

互联网人的娱乐精神之28岁退休 & P8和生活助理的故事

码农神说

程序员 漫画 退休

Android APP启动白屏优化

小菜鸟学php

android白屏

flutter开发

InfoQ_1c4a1f813eb1

Zoom 妥协!对免费用户开放端到端加密服务

神经星星

音视频 Zoom 端到端加密 隐私保护 数据保护

小师妹学JVM之:JIT中的LogCompilation

程序那些事

JVM 「Java 25周年」 小师妹 性能调优 JIT

还在埋头干活?给程序员的几个忠告

四猿外

Java 深度思考 程序员 随笔杂谈 程序员成长

Facebook 起诉水军公司:删不过来,我还告不过来吗?

神经星星

facebook 亚马逊云 AWS Lightsail 水军 虚假评论

当你输入get/set命令的时候,Redis做了什么

老胡爱分享

redis 源码分析

必知必会,程序员都应该会的Linux的50个知识点!

Java小咖秀

Linux 面试 运维 Shell 经验

GitHub 热榜:一款堪称作业终结者的开源神器!

JackTian

GitHub 开源项目 工具类网站 学生党 Text-to-handwriting

架构师训练营作业 (第三周)

王海

极客大学架构师训练营

一种极致性能的缓冲队列

捉虫大师

Java 性能

数据库如何弹性伸缩?

Aaron_涛

数据库 架构 云原生

思想不进化的人都是可怜人

Neco.W

提升认知 思考 进步 进化

架构师训练营-week01 学习总结

GunShotPanda

云原生场景下企业API 网关选型及落地实践

云原生场景下企业API 网关选型及落地实践

智能支付稳定性测试实战-InfoQ