故障定位 | 服务&接口双粒度动态拓扑,精准定位共享连接池故障

上一期,我们分享了Web应用接口级的故障定位方法,通过细化到接口级的定位方法,可以精准地过滤掉干扰因素。然而这种方法并不适用所有场景,过于细致的过滤有时会产生新的问题。

本文将以共享连接池故障场景为例进行说明,提出一种利用服务&接口双粒度动态拓扑进行故障定位的方法。

1 故障背景

  • **链路1:**service-b的callB接口 -> service-p的callB接口 -> service-h的callB接口

  • **链路2:**service-o的callO接口 -> service-p的callO接口 -> service-l的callO接口

其中链路1中的service-p的callB接口和链路2中的callO接口,共用了同一个Http连接池来访问下游不同的服务。

但是尽管如此,两条链路在接口级别上是没有交集的,如下图所示。

在这样的场景下,假如service-h的callB接口出现了故障,会有以下情况发生:

  • service-h的callB接口故障 -> 影响到 service-p的callB接口 -> 影响到service-b的callB接口

  • service-p的callB接口长期占用http连接 -> 共享Http连接池中的连接不够用 -> service-p的callO接口获取不到连接而等待 -> 影响到service-o的callIO接口

也就是说,尽管两条链路的接口调用没有交集,但是因为在同一个服务节点上共享了连接池的资源,链路1中的service-h服务出现故障会导致链路2中的service-o服务也出现故障。

此时,假如我们依照接口级根因定位的方法去分析链路2,就只能只能定位到service-p服务的callO接口。而真实情况是,链路1和链路2的故障根因都在service-h的callB接口。

既然接口级别的根因定位在这里无法准确定位,那应该怎么办?

答案:服务级拓扑和接口级拓扑动态结合。当接口级拓扑无法继续往下分析时,结合服务级拓扑找到答案。

下面案例中将给出具体方案。

2 实战案例

我们到RootTalk Sandbox上进行上述故障场景的复现。

RootTalk Sandbox是一个故障演练和定位的系统,可以进行多种故障场景的复现,目前开放注册。

地址:sandbox.databuff.com/

2.1 故障注入

如上图所示进行操作,对拓扑图中的service-h::k8s 这个服务的所有实例的CallDB接口 注入耗时突增的故障。

注入后等待2~3分钟,可直接点击跳转到Databuff的故障定位平台。

2.2 故障定位

登录Databuff后可以看到完整故障树,如下图。

点击故障树底部节点,可以定位到接口。

从上面两张图中可以看到,入口服务service-b和service-o均出现告警,而根因节点都指向service-h服务,故障根因是service-h的callB接口的存在响应时间升高的问题。

我们再来详细看下对service-p服务的分析结论:

service-p的 callB接口和callO接口都出现了问题,是因为apache-httpclient_2这个共享连接池导致的相互影响。

点击页面中的链接继续下钻,可以来验证这一结论。

针对callB接口来说,客户端和服务端的平均响应时间均发生突变,一般是服务端的问题。

再看callO接口,客户端响应时间均发生突变,而服务端没有变化,这种情况可能是客户端或者网络的问题。

继续看callO接口的获取连接时间,发现耗时突增,说明连接池中的连接一直在被占用而被迫等待。

综上,我们可以得到明确的根因分析结论:

  • 链路1和链路2的入口服务service-b和service-o均出现告警,故障根因是service-h::k8s服务中的callB接口存在耗时突增;

  • 中间节点service-p服务上的callB接口和callO接口都出现了问题,原因是共享连接池apache-httpclient_2一直被占用而被迫等待。

这个结论和前面分析的场景以及注入的故障是匹配的。

相关推荐
LEE2 小时前
前端转型全栈 00:AI 时代该学哪些,不该学哪些
前端·后端
Go_error2 小时前
上下文取消链:摧毁我们支付系统的 bug
后端·go
无限压榨切图仔2 小时前
一个优惠券需求改了三端,我才明白全栈不是多学一门语言
前端·后端
CRZZX2 小时前
阶段 0.1:为 AI Agent 项目建立敏感配置治理与安全基线
后端
Zane19942 小时前
用了Optional,为什么NPE还是防不住?
java·后端
yunwei372 小时前
eBPF 示例教程:实现 `scx_nest` 调度器
linux·后端·性能优化
薛定谔的算法2 小时前
从 NestJS 到 Spring Boot:一次完整的 Node.js → Java 后端迁移实战
后端
Shinomiya2 小时前
我最近在学 Linux 进程控制:fork、退出码与进程等待
后端
企业数字化笔记2 小时前
固定资产Excel批量导入怎么防重复?资产编码、重复检查和错误回执
java·后端·excel
SamDeepThinking2 小时前
Java 17内存屏障:为什么需要,怎么用
java·后端·面试