结论先行:用户说卡,先分清是一个人卡还是一批人卡。一个人卡,从会话侧往回查;一批人卡,从链路侧往外看。判断依据不是老工程师的直觉,而是三个标识能不能对上:用户或会话标识、一次请求的链路标识、出问题的接口或页面标识。三个缺两个,后面的排查都会变成猜。
本文只谈用户报障之后的定位顺序,以及把一次请求串起来需要哪几个标识,不谈终端侧该采集哪些体验指标,也不谈故障影响面怎么对外通报。前一件事是采集设计,后一件事是对外沟通,各有各的口径。
先分类:一个人卡,还是一批人卡
这两类问题的排查路径几乎相反。一个人卡,问题大概率在终端侧——机型、系统版本、网络环境、账号状态;一批人卡,问题大概率在链路侧——某个接口、某个机房、某次发布。走错方向最贵的代价不是多查一步,而是把一批人的问题当成个案处理,等投诉堆起来才发现是共性。
快速分类只需要一个动作:看同一时间窗内,同一个接口的错误率与耗时分位数有没有同步抬升。分位数一起抬,是共性问题;只有平均值动了而分位数没动,多半是个别长尾请求或个别终端。这里强调分位数,是因为平均值在这个场景里几乎没有判断力——一百个请求里有一个卡了三十秒,平均值只动了一点点,用户体感却是完全卡死。
三个标识,缺一个就得多绕一圈
| 标识 | 从哪来 | 断了会怎样 |
|---|---|---|
| 用户或会话标识 | 终端侧采集在登录后绑定;同一账号在多端登录要能区分会话 | 没法从一句「我用不了」反查到具体请求,只能靠时间段盲筛 |
| 链路标识 | 服务端采集生成,随调用在网关与微服务之间透传 | 一次慢请求拆不成段,只能看到总耗时,说不出慢在哪一层 |
| 接口或页面标识 | 页面与后端接口的对应关系要提前登记 | 分不清是渲染慢还是接口慢,前端与后端会互相等对方先查 |
三个标识里,最容易断的是第二个。它的技术前提是透传:从接入层进来时生成,经过网关、服务、消息队列时不能丢,异步调用与批处理链路尤其容易断——这类链路上的耗时往往正好是最长的那一段,却因为没有标识而被归到「其他」里。
分段:把一次慢请求拆成五段来看
拿到链路之后,看的是占比,不是绝对值。同样一个三秒的请求,端侧渲染占两秒和数据库占两秒,处理方向完全不同。可用的分段方法是:端侧渲染、网络传输、接入层、服务与中间件、数据库。
- 端侧渲染占比高:往终端性能、页面资源、版本差异上查,与后端无关。
- 接入层占比高:往网关限流、负载均衡策略、连接复用上查。
- 服务与中间件占比高:再看是应用自身线程阻塞,还是缓存穿透与消息堆积。
- 数据库占比高:看慢查询、锁等待、大事务,而不是先去加索引。
分段的价值在于把责任边界摆出来。分布式系统里最常见的僵局是「不是我慢」,两个团队各自看自己的指标都正常,因为谁都没有那一段的耗时占比。
反向:后端先报了错,怎么找受影响的人
反向路径与前面相反:从一个错误请求出发,查这一批请求背后涉及哪些用户会话。这条路对客服的价值比运维更大——能定向安抚,而不是等用户打进来。它的前提还是那三个标识要能对上,尤其是会话与链路之间的绑定关系;如果前端会话和后端链路各存一套 ID,互相查不到,这条反向路就走不通。
实操上值得提前做一件事:把「按用户查请求」和「按请求查用户」这两个查询做成固定入口,而不是每次临时写条件。临时写的好处是灵活,坏处是每次口径都不一样,事后对不上。
三个常见误判
- 只看平均值。前面说过,平均值会把长尾抹平,而用户投诉的恰恰是长尾。
- 后端全是绿灯就断定没事。后端指标正常只说明服务自身没报错,说明不了用户端到接口这一段的路由、运营商、终端状态。
- 拿测试环境的结论推生产。测试环境没有真实流量分布,也没有真实的第三方依赖抖动。
边界与前提
三点说明。其一,标识的透传范围取决于采集组件在各语言与框架上的覆盖程度,本文给的是通用设计口径,具体以所选平台的实际能力与本项目实测为准。其二,文中涉及的性能与定位效率数字属参考性指标,正式承诺以 PoC 验证值为准。其三,用户会话数据涉及个人信息,查询入口的开放范围与审计要求应按本单位合规口径另行约定。
这套顺序并不复杂,难的是三个标识在项目初期就被设计进去。深圳市奇摩计算机有限公司在做全链路监测这类项目时,习惯在试点阶段就把「能不能按用户反查」当成一项验收动作来测,而不是等上线之后再说。预约咨询,可以拿一个真实的用户报障案例,把这三个标识对一遍。
