新人手册系列:思考篇-稳定性&大促保障
质量保障设计的三位一体
- 如何思考
水平:通用的平台测试方案,不限于具体行业,通过技术手段形成通用化能力。
行业:具有特定业务形态的业务测试方案,结合业务特点形成针对性解决方案。
专项:对具体问题深挖解决方案,专项保障的测试方案,例如资损、预案、全链路压测等
大促质量保障
- 全链路压测
全链路压测是以全链路业务模型为基础,将前端系统、后端应用、中间适配层、DB等整个系统环境,完整得纳入到压测范围中,以http请求为载体,模拟真实的用户行为,在线上构造出真实的超大规模的访问流量,以全链路压测模型施压,直至达到目标峰值,在压测过程中发现系统瓶颈和验证系统能力。全链路压测自2013年诞生至今,一直稳居大促质量保障核武器地位。
基本原理:
入口:前端http请求,如detail页面、确认订单页面、提交订单等。
媒介:以中间件技术为主线,将全链路压测标识(见名词解释),通过HSF、tddl、notify等,进行传递
终点:影子表,当流量执行到存储层时,tddl会进行判断,带全链路压测标记的数据流量走影子表,影子表为正式表前加“__test_”,即__test_表名
压测标传递原理:
http请求中加上标记(tb_xxxxx_t=1);tbsession中的埋点将该标记映射到中间件中(t=1);而后随系统调用,通过上下文和各个中间件将t=1标记一直传递下去,业务逻辑根据此标识判断是否走全链路逻辑,最终直到各个系统依赖的DB层,通过tddl判断eagleeye中全链路标识,若带有t=1,则走影子表,若t=null,则走正式表。
登录和非登录会做业务支持上的区分,登录用户会通过login集体登录预热,携带打标cookie。
全链路名词解
名称 |
内容 |
备注 |
---|---|---|
影子表 |
全链路压测数据归属;和正式表同库;命名规则:__test_正式表名 |
无 |
全链路压测标识 |
tb_xxxxx_t=1 |
对应中间件上下文中是t=1 |
全链路功能标识 |
tb_xxxxx_f=1 |
对应中间件上下文中是f=1,f标为t标的子标,用于压测绕过,但是功能不绕过的逻辑判断 |
流量构造接口提供 |
由于全链路压测主要执行载体为HTTP请求,因此对于构造复杂,需要动态获取http参数的http请求构建,需要提供对应的接口,来完成该http请求的构建。条件:具有动态参数的http请求流量构建。入参:基础数据,商品、买家、卖家以及通过这三个基础数据可查询到的信息(商品SKU、收货地址等)产出:可执行的http请求 |
|
单链路链路http请求提供标准 |
URL自身要求可执行;使用条件标识清楚(是否需要带中间件的标等、是否需要用户登陆、请求方式(get or post));URL量级提供到位,URL量级>=2*压测量级;提供时间要求URL<5:提前0.5天;5<URL<10:提前一天;10<URL<20:提前两天;URL>20:提前3天提供;若是实时的URL,则需要尽可能将URL合并缩减,并保证各个URL可用,不需要重复修改 |
- URL自身要求
- 可执行;
- 使用条件标识清楚(是否需要带中间件的标等、是否需要用户登陆、请求方式(get or post));
- URL量级提供到位,URL量级>=2*压测量级;
- 提供时间要求
- URL<5:提前0.5天;5<URL<10:提前一天;
- 10<URL<20:提前两天;
- URL>20:提前3天提供;
- 若是实时的URL,则需要尽可能将URL合并缩减,并保证各个URL可用,不需要重复修改
- 功能预演
每年全民预演都是最耗人力的一项测试任务,需要各种行业的PD运营跟测试一起参加。所以提高全民预演的有效性发现更多有效bug,提高组织效率非常重要。每年大促,在所有业务需求整体发布之后,会邀请产品、运营、开发、测试、CCO等多种角色集合到一起,对整个大促期间核心玩法进行全民的测试和验收。
预演组织管理
- 用例录入、任务分配。
- 数据构造。
- 账号分配。
- 业务设置。
- 进度大盘
预演执行引导
- 预演任务、执行账号自动领取
- 业务执行。
- 问题跟踪
预演问题排查
- 问题复现&排查。自动填充更多bug信息。
- 预案专项
预案每个BU都有,预案是最保命的,但是有时候预案也是最致命的,集团有各种灰度方案,发布过程中有各种灰度的策略,现在能够引起故障,除了系统问题还有一个最高风险就是错误的预案被推送。所以预案是我们风险非常高的东西,大促各个BU在协同的时候,一个预案可能影响到很多上下游系统。所以是绝对不允许有一个人没有作战规律去执行的。但是我们强调了很多次作战纪律,仍然因为人的因素或者是新老团队交接而犯错。所以一个安全的预案平台是至关重要的。在预案执行时对权限和AB角的流程机制也是非常重要的。
- 资损防控
大促资损防控怎么做?
目标:了解大促需求和目标,制定资损专项目标,跟各业务域接口人KO,KO内容包括时间计划,资损目标,纪律;
梳理:梳理各域历史遗留资损问题,跟进修复进度;
模版:制定资损点梳理模板,跟集团资损专项总负责人review,给各业务域接口人进行梳理;
Review:损梳理模板review,资损点测试,监控项补全,资损用例可沉淀到天启资损专项用例组;
跟进:核心项目资损链路梳理及review,预演资损问题跟进,进行记录及风险评估,同步大促项目组;
作战计划:大促值班计划,资损监控问题(如bcp)反馈群,跟进goc反馈问题,进行记录及风险评估;
复盘:大促复盘,当天问题分析,后续改进建议。
- 故障演练
提高系统,流程,人员在面对突发状况的应对能力,真正实现故障快速发现,快速止损,快速恢复,提升系统的整体的健壮性。
演练流程规范
攻防演练实战
准备方法
- 分析链路和监控报警关系,设计演练场景。
- 在预发环境模拟注入验证,关注点 故障可以生效。
- 在安全生产环境注入验证,关注点 故障点可以触发监控报警。
- 将演练场景在mk平台归档到演练空间
流量模拟
演练需要在安全生产环境通过压测流量模拟出故障,需配置故障注入流量的策略配置。
监控报警
业务域同学要判断出服务会导致的故障监控报警,新版应急场景。
故障模拟
- 首先在预发环境验证故障和预案,确认故障注入能生效。
- 在安全生产环境验证演练方案是否能触发监控报警
预期恢复动作
预期恢复动作会考核开发的处理,蓝军提供的方案需要准确。
- JavaWeb(六)之MVC与三层架构设计
- 纸上谈兵: 最短路径与贪婪
- Java魔法堂:枚举类型详解
- 机器学习笔记(5):多类逻辑回归-手动添加隐藏层
- JavaWeb(五)之JSTL标签库
- spring cloud:Edgware.RELEASE版本中zuul回退方法的变化
- js中几种实用的跨域方法原理详解
- spring cloud:Edgware.RELEASE版本hystrix超时新坑
- JS魔法堂:再识ASCII实体、符号实体和字符实体
- MyBatis之传入参数——parameterType
- 被解放的姜戈07 马不停蹄
- 机器学习笔记(6):多类逻辑回归-使用gluon
- JS魔法堂:被玩坏的innerHTML、innerText、textContent和value属性
- JavaWeb(四)EL表达式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Typescript 使用日志(干货)
- 22+ 高频实用的 JavaScript 片段 (2020年)
- VSCode 的这些黑科技 99% 的人都不知道
- YOLOv4 中的 Mish 激活函数
- pdbsplit将多个chain的pdb文件分割
- rk3399 wifi和eth0共存 调试
- 23条JavaScript初学者应知的最佳实践方法
- 黑板客爬虫闯关游戏
- Python自学成才之路 多进程开发
- Python自学成才之路 进程间通信
- android 功耗(1)---android 功耗分析方法和优化
- 为什么要写 tf.Graph().as_default()
- tf.get_variable_scope().reuse_variables() 的使用
- Tensorflow小技巧整理:
- Tensorflow学习笔记——Summary用法