业务防资损,质量保障的第一要务!
前几天知识星球有同学向我咨询了这样一个问题:生产业务发生故障,涉及金额非常大,可能要被干掉,该怎么应对?
问题背景是这样:银行证券交易业务,未对输入金额乘以10000(单位万元),该模块上线大半年了,之前由外包同学负责测试,当时只检查了页面和流程,业务和监管平台也验收通过了。
在我看来,这是一个比较低级的问题。跨度大半年的周期,应该有很多人的工作涉及到核心交易模块,但生产还是出了这种问题,只能证明日常的测试验证和风险管控环节有很大不足。我给这位同学的建议有如下三点:
- 承认错误,交付质量不足带来的原因(而不单单是测试的问题);
- 拿出复盘结果,说明过程,指出不足(流程、交接、校验、监控);
- 后续行动方案,优化流程,系统强制校验,风险评估,业务防资损;
这篇文章,我想聊聊生产环境的业务防资损相关的内容。
如何理解防资损?
我们都知道质量保障的核心目标是交付质量和交付效率,我在文章中也一直在表达一个观点:技术本身不具备任何直接价值,而是通过支撑业务目标达成而体现自己的价值。
业务目标的达成,除了通过直接向用户提供服务来获取收益之外,本身的业务逻辑也需要具备自洽的能力,即具备不会被外界主观或客观因素导致自身业务出问题,无法提供服务而带来自身损失。
比如上述的银行证券交易业务,比如时不时听到的某APP被薅羊毛,比如自身的服务需要具备持续为用户提供正常访问和服务的能力(而不是经常宕机),这些其实都是资损的范畴,即资产损失。那什么是资损呢?
定义:由于设计缺陷、服务故障、误操作等导致公司或者用户蒙受直接或间接资金损失的场景;
根因:资损的根因,按照我的经验和工作实践,绝大部分资损的原因都是数值一致性问题导致;
处理策略:设计和编码时尽量评估规避风险,线上发布后尽快发现实时校验,资损发生后尽快处理解决;
防资损的四大策略
要做好防资损,以我的经验,结合具体的工作实践,我建议从如下几点开展。
事前:梳理/预防
从定义可以看出,资损是由于设计缺陷、服务故障、误操作等导致的。
因此在前期产品设计时,就应该尽可能的梳理出可能导致资损的场景;在编码实现时考虑到对应的风险,有相应的冗余手段(比如输入时的强逻辑校验);在测试阶段测试用例尽可能覆盖各种异常和边界场景,并通过自动化的手段在后续迭代中持续校验。
事中:巡检/校验
产品线上发布后,要做的事情其实就是巡检+校验。
任务巡检:通过各种自动化或者定时任务的方式去不断巡检和资损有关的场景。
规则校验:比如交易金额相关的,可以制定规则库,所有的巡检任务必须符合防资损业务规则。
人工盯盘:通过轮值的方式不定时的去观察相关的业务监控,比如交易量、优惠券使用量等同比环比数据。
监控告警:对相关的资损场景定制专门的防资损监控,并且做到出现异常时及时告警和实时响应处理机制。
优先止血:当线上发生资损时,优先做到业务止血,就防止资损的范围和影响进一步扩大,在考虑从根本上解决问题。
事后:复盘/运营
资损事件发生后,及时组织相关人员参与复盘,分析资损事件的前因后果和根因,找到在设计、研发、测试、验收等环节存在的不足之处,制定对应的优化改进措施,并实时跟进改进项的落地和验证其有效性。这是一个长期的持续的过程,需要持续的运营这种机制。
资损大部分问题出现在数据不一致方面,因此日常的数据治理是必不可少的。当然,以文章开头的案例为例,其实也可以看作是一个技术债务的问题,即没有对输入进行强制的规则校验。因此定期的清除技术债务,也是需要考虑的。
组织:目标/责任
无论是事前的场景梳理和预防措施的制定,还是事中的线上巡检校验和监控告警响应处理,或者事后的故障复盘和改进落地,都需要有组织有体系的去跟进。
从团队或组织层面来说,对齐业务防资损目标,明确各角色岗位职责,有效组织开展防资损工作也是很重要的一点。
线上业务防资损体系
线上业务防资损,我们当时做了一套线上的防资损平台,大致构成如下:
场景管理:资损业务场景、资损数据场景、研发规范场景、历史故障场景,进行平台化管理。
巡检方式:以支付和财务对账为例,通过实时对账和离线对账解决数据一致性问题,通过监控告警和自动化测试巡检方式,做到资损的及时发现和及时处理。
技术组件:实时对账主要使用Flink,离线对账则是通过阿里云的dataworks,监控告警采用prometheus的监控体系,线上的自动化测试巡检则是通过专门的定制化改造来进行。
应急措施:主要包括故障应急响应机制、资损的应急预案、业务入口限流降级和针对应用服务的故障自愈。
虚拟团队:防资损需要有组织有体系的开展,而虚拟团队就是将防资损职责明确定义到各团队不同角色。
比如:有专门的NOC团队负责人工盯盘和故障发生时的信息分发和启动应急响应机制;运维和研发同学从技术的角度进行快速响应和问题处理,保障优先业务止血,而轮值leader更多的是进行重大问题决策。
其实业务防资损本身就是质量保障很重要的一环,甚至说是第一要务。资损问题不发生还好,发生了几乎都是生产P0/P1故障。
文章开头的案例从侧面也证明了质量内建和防资损的重要性,测试需要持续验证来保障高质量的生产交付。