最近在思考 MDD 结合 SRE,花了两周的时间打造了小程序端的可观测平台,接下来和大家分享一下整个心历路程。谈谈我的一些启发,顺便谈谈当工程师具备 MDD 意识后,是否能如虎添翼。
事情的背景是这样的,2 月 10 日,好大夫部分小程序用户投诉上传图片失败。整个排查过程有 10 多人参加,排查了三天才有结论。我们来回顾一下当时的情况。
一、一团乱麻,谁人背锅侠?
大家知道上传图片失败问题,一直是个老大难,因为失败的原因太多了。对一般的工程师而言,整个流程可能是一个黑盒模型,缺少一个抓手去分析问题。
这时候工程师大脑中会有一堆问号。
简单说一下这个问题是如何排查的。
- 怀疑用户网络问题,联系用户切换网络尝试依然失败。加上分析 Kong 日志,发现部分用户重试多次都是失败,切换到好大夫的 APP 能上传成功,前端认为不是用户侧网络问题。
- 怀疑链路传输问题,我们有多家网络节点运营商,尝试切换链路,甚至直接回源,问题还依然存在。期间通过抓包并和运营商技术一起排查未能明确问题原因,给出的反馈还是用户侧问题。
- 怀疑小程序版本问题,2 月 9 日有个业务方向上线了小程序,修改的是 http2 相关的,大家很兴奋,时间点也能对上,觉得抓到罪魁祸首了,然后就是紧急上线,用户更新包后问题依然存在,这下打击有点大。
- 怀疑 Kong 进程处理异常。前面几个关键点都怀疑了,大家谁都说服不了谁的问题。11 日晚上重启 Kong 进程,担心 Kong 进程启动太久,有垃圾没有回收,有点病急乱投医了,试一试总不差。重启后第二天问题依然没有得到缓解。
- 经过几轮排查,对比最近几天 code=400 的占比趋势,2 月 10 ~ 11 日比之前多了一倍,Code=400 的 route_name 基本上也都是小程序侧的上传图片接口。基本上定位是小程序端的问题,越发怀疑微信端是否异常了。联系微信社区,联系微信内部开发,2 月 13 日下午才得到反馈:“2 月 9 日下午微信升级了基础库,灰度了 1%IOS 用户,并于 2 月 11 日回滚,部分用户还有异常需要清理缓存”。
虽然这次问题是找到了,整整三天,包括运维、前端、服务端、系统架构组一共有 10 多人参入了排查。
痛定思痛,有没方式缩短异常定位时长呢?首先我们来看看用户上传会经历哪几个环节。
一次网络请求,中间其实经历了很多环节,细节这里就不展开讨论了,我们来看一下简化后的模型,用户发起请求,到网络节点,再到源站处理,再经过网络节点返回响应给用户。
从图中可以看出,上传失败存在几个关键的环节中:用户侧、网络节点、入口网关、后端服务。
- 可能是用户侧本地异常,如机器内存不足,小程序闪退。可能是用户网络不稳定,还有可能是用户在上传图片的过程中,中途将小程序切换到后台,重新唤起小程序续传失败。
- 为了请求的安全和加速,在请求打到源站入口网关前,是先走运营商传输节点,传输节点也对接了多家运营商,传输不稳定或命中防火墙策略也会造成上传失败。
- 入口网关用的是 kong,如果路由策略配置异常,或者 Kong 节点异常,或者某个 upstream 节点异常都会造成上传失败。
- 后端图片服务,如果处理能力不足,负载高,进程夯住,或其他异常也会造成上传失败。
经过思考,如何做到普适性呢,就要面临以下几个问题。
- 异常能被有效地观测到吗?
- 异常定位对经验要求很高,如何减少传承成本?
- 异常分析有哪些提效的工具链,能平台化吗?
- 异常千千万万,再加上排练组合,真的能通过数据分析出来吗?
- 异常分析平台增加了学习成本,会不会增加工程师负担,会质疑研发平台的受益?
深入思考,有点细思极恐,异常定位好难呀,提效异常定位更难!
二、追本溯源,能否提效异常定位?
很多工程师在分析异常的时候,往往聚焦单次问题,一上来就陷入个案分析的细节,耗神耗力,心态都会查崩。
随着网站拓扑的演进,异常定位也越来难,很多公司都在推进 SRE 体系建设,其中对可观测性呼声也越来越高。异常如何被量化,被观测。这其实是一个“工程问题”。
所谓工程问题本质上是数学,需要在一个定义良好的环境里,用定义良好的参数描写一个定义良好的问题。引起网站异常的的原因有各种各样,就像诊断患者一样。统计分析健康的人和病患各项身体基能指标的差异性,从而判断病患程度及探究病因。
结合我的一些日常排障经验,来看一下异常定位这个工程问题。
异常定位需要在一个参照系中进行,通过可视化界面去呈现 SLI 的波动性,而 SLI 的波动性往往是和引起异常的根因相关联。分析不同 SLI 波动振幅差异性大小,从而推断异常的可能性原因。
简单来说,就是给异常进行数学建模,并关联到可观测的 SLI 上。透过 SLI 的表象反查异常原因。说起来比较简单,和医生诊断一样,往往一种病理现象对应了不同的病因,而同一种病因也会有不同的表象。有急性有慢性,还有扩散传递性,一种病变可能引发一系列身体其他的病变,溯源病因可能需要多次会诊。当然经验越丰富,数据越多,模型分析也就越准确。