使用篇丨链路追踪(Tracing)很简单:链路拓扑

news2025/4/8 21:05:24

作者:涯海

最近一年,小玉所在的业务部门发起了轰轰烈烈的微服务化运动,大量业务中台应用被拆分成更细粒度的微服务应用。为了迎接即将到来的双十一大促重保活动,小玉的主管让她在一周内梳理出订单中心的全局关键上下游依赖,提前拉通各方对齐重保方案。这个任务可愁坏了小玉,平时她只与直接上下游业务方打交道,现在要梳理出订单中心完整的依赖路径,头发愁掉了一大把仍然不知道该如何下手。无奈之下,小玉再次求助于万能的小明。

针对小玉的问题,小明提出了一个想法,首先调用链可以追踪一次请求的完整调用路径,但是单条调用链无法反映出所有的调用分支,也无法通过流量大小体现出依赖的强弱,而逐条分析调用链的成本又太高。那么,是否可以通过程序将一批具有相同特征(比如经过某个应用,或者调用了某个接口)的调用链聚合成一颗树,通过分析这棵树的形态与流量,就可以快速梳理出关键节点与依赖路径,而这就是链路拓扑功能的雏形。

在这里插入图片描述

如上图所示,入口应用 A 依赖了多个不同深度的下游应用,并且每次调用的路径并不相同。为了梳理出应用 A 的完整调用依赖,可以将多条调用链聚合成一棵树,从根节点到叶子节点的每条路径都代表着一种流量流转路径,而节点的状态反映了流量的特征,比如次数、耗时、错误率等。通过调用链聚合,综合分析端到端流量路径与状态的方法就是链路拓扑。 链路拓扑与调用链的关系就好比样本集与离散样本点,前者反映了整体的分布情况,可以有效避免单个样本随机性对评估结果的影响。

01 链路拓扑的经典应用场景

链路拓扑最核心的价值,就是通过分析节点间依赖路径与状态,提供强弱依赖梳理、瓶颈点分析、影响面分析、故障传播链分析等能力,下面我们来深入了解下这些经典用法。

(一)强弱依赖梳理

链路拓扑最典型、最被人熟知的应用场景就是依赖梳理,特别是在一个大型分布式系统中,数以万计的应用间依赖关系复杂到令运维同学怀疑人生。下图展示了 2012 年的淘宝核心链路应用拓扑,密密麻麻如蛛网般的依赖关系已经远远超出了人工梳理的范畴,而这种情况在微服务迅猛发展的当下并不少见。

在这里插入图片描述

在复杂业务环境中,不仅需要梳理出依赖关系图,还需要识别哪些是影响核心业务的强依赖,哪些是“无伤大雅”的弱依赖。针对强依赖要投入更多的人力与资源,建立更加完善的保障体系,比如电话告警,联合压测等。针对弱依赖,可以考虑是否能够移除,或者建立次一级的保障措施。

区分强弱依赖的方式主要有以下几种:

  1. 根据流量大小进行区分。这是一种简单粗暴的区分方式,大于一定流量阈值或比例的就识别为强依赖,否则视为弱依赖。这种判断方式的好处是简单清晰,可以由链路追踪平台自动识别,无需人力干预。缺点是不够准确,一些特殊的关键依赖虽然流量不大,但是却会直接影响业务的稳定性。

  2. 根据同步/异步调用类型进行区分。这种区分方式的好处也是简单、易操作,减少了异步非阻塞(如消息)调用的干扰。缺点是在同步调用为主的业务中筛选效果不佳,而在异步调用为主的业务(红包、热点推送)可能造成误判。

  3. 人工标注。鉴于业务的差异性,由业务 Owner 对自身依赖的直接下游的强弱性进行人工标注识别,可靠性会更高。但是这种方式对于人员经验和时间成本要求很高,并且无法自适应业务的变化。

  4. 半人工标注。首先由链路追踪平台根据流量大小、同步/异步进行初步的强弱依赖识别,再通过有经验的同学进行人工标注修正。这样既节省了人力成本,也能有限度的自适应未来的业务变化。

在这里插入图片描述

强弱依赖梳理是相对低频的工作,通常发生在在大促或重保活动准备阶段、新应用上线或老应用下线、上云搬站等场景。比如阿里在每年双十一大促前,都会梳理核心业务的强弱依赖,并与往年进行对比,以便更好的进行针对性保障。

(二)瓶颈点/影响面分析

链路拓扑在问题诊断领域最常见的用法就是瓶颈点分析与影响面分析。前者是从当前节点向下游寻找导致问题发生的原因,主要用于问题定位;而后者是从问题节点向上游分析被影响的范围,主要用于业务风险定级。

接下来,我们通过一个数据库异常的案例,对比下这两种用法与视角的区别,如下图所示。

  • 某天上午,应用 A 的管理员收到用户反馈服务响应超时,通过查看链路拓扑状态,发现 A 应用依赖的 D 应用接口变慢,而 D 应用调用数据库接口也出现异常。因此,小 A 通知小 D 即刻排查数据库连接等状态,尽快恢复可用性。这就是一个瓶颈点分析的过程。

  • 由于小 D 业务不熟练,半小时过去了还没有完成有效的恢复动作,并且触发了数据库服务端异常。负责 DB 运维的同学收到数据库服务端告警后,通过链路拓扑向上回溯业务影响面,发现直接依赖的 D、E 两个应用均出现了大量慢 SQL,并导致间接依赖的应用 A、B 出现不同程度的服务响应超时。果断执行了数据库扩容,最终恢复了全部应用的正常访问。这就是通过影响面分析,辅助运维决策的过程。

在这里插入图片描述

瓶颈点与影响面分析主要是基于一段时间内的静态拓扑数据,并没有体现时间变化对拓扑节点状态的影响,无法回溯故障传播的过程。如上图右侧所示,如果只看这一张拓扑,我们难以判断出导致数据库服务端异常的应用到底是 D 还是 E。那么,是否能够动态回放链路拓扑的变化,更直观的分析问题源与传播趋势?答案无疑是肯定的,请看下文介绍。

(三)故障传播链分析

抛开时间的维度,问题源与影响面的边界并不是很清晰。一个被影响方可能会成为新的问题源,引发更大的故障。因此,为了能够更加真实的还原故障演变过程,我们需要观察并对比一组时间线连续的静态链路拓扑快照集,通过不同快照之间节点状态的变化还原故障传播链。这就好比通过监控视频还原凶案发生过程,要比单独的一张照片更加可靠。

以上一小节的数据库故障为例,一开始应用 D 由于请求缓存未命中,从而大量请求数据库导致慢 SQL,进而影响上游应用也出现响应超时。随着情况继续恶化,数据库服务端也开始过载,进而影响了应用 E 的正常调用。最后,应用 A、B 均出现大量响应超时,API 网关由于连接不足开始拒绝访问,引发更大面积的服务不可用。

在这里插入图片描述

在真实生产环境中,拓扑依赖与故障传播的过程可能会更加复杂,为了简化分析过程,可以根据一定规则将节点状态提取为各类异常事件,观察不同时刻的异常事件数量也可以辅助判断故障发生、传播与恢复的过程,如下图所示。

在这里插入图片描述

02 链路拓扑聚合维度

链路拓扑的聚合维度决定着拓扑节点的类型,面向不同的用户角色,提供了差异化的分析视角。在实际应用中,最典型的三种链路拓扑聚合维度分别是应用、接口与自定义维度,分别对应着应用拓扑、接口拓扑和业务拓扑。

  • 应用拓扑, 顾名思义就是根据应用名称进行链路聚合,反映了应用间的依赖关系与总体流量状态。由于数据聚合粒度较粗,局部异常会被平均值掩盖,不适合精细化的问题诊断,更适合全局依赖梳理与重大故障定界,用户角色偏向于 PE 运维或 SRE 稳定性负责人。

  • 接口拓扑, 是在服务接口这一维度进行的链路聚合,相比于应用拓扑更贴近研发视角,因为日常迭代的对象通常是某个具体的服务接口,无论是新接口上线、老接口下线或核心接口重保,接口粒度的链路拓扑更符合研发测试流程与职责划分习惯。应用与接口都是链路追踪领域的基础对象,对应的拓扑可以由链路追踪平台自动生成,无需过多的人工干预,使用起来较为方便。

  • 业务拓扑, 是根据自定义维度聚合生成的偏业务视角的链路拓扑,通常比接口维度要更深一级,比如某个下单接口可以根据商品类目维度进一步细分为女装或家电,如下图所示。业务拓扑一般无法由链路追踪平台自动生成,需要用户结合业务特性定制聚合规则。此外,自定义维度的来源比较广泛,可以是手动添加的 Attributes 自定义标签,也可以是 HTTP 请求出入参,或者是所在机器的环境标签。在这方面,开源社区缺乏相应的标准,而各大厂商的商业化实现差异也比较大。

在这里插入图片描述

综上所述,不同聚合维度生成的链路拓扑具备不同功能定位与特性,如下表所示:

在这里插入图片描述

03 链路拓扑生成方式

为了最大程度的保留链路数据的端到端关联信息,链路拓扑通常是基于调用链明细数据直接聚合生成,而不是基于指标数据的二次聚合。细心的读者可能会发现这里隐藏着一个颇具挑战的技术难题,就是如何平衡海量链路数据聚合的实时性、准确性与灵活性。理想情况下,我们希望基于符合条件的全量调用链明细数据快速生成最真实的链路拓扑,实现“又快又准又灵活”。但在实际应用中,鱼与熊掌不可兼得,我们只能在“快”、“准”、“灵活”之间进行抉择,也因此衍生出了不同的链路拓扑生成流派。

在这里插入图片描述

(一)实时聚合

实时聚合是根据用户指定查询条件,动态筛选调用链并生成拓扑图的一种方式。这种方式的好处是实时性较高,使用非常灵活,可以指定任意条件,比如查看大于 3S 的调用链生成的拓扑,或者仅包含异常调用的拓扑。缺点是当满足条件的调用链明细数据量超过一定阈值后,可能会打爆实时聚合计算节点,因此,通过会设定一个聚合条数上限,比如5千条,牺牲一定的数据精确度,换来极高的灵活度与实时性。

在这里插入图片描述

(二)离线聚合

离线聚合是根据一组事先定义好的聚合规则,周期性生成拓扑数据的一种方式。例如不包含任何筛选条件的应用、接口这种基础拓扑数据就可以通过离线聚合生成。这种聚合方式的好处是可以利用离线计算的水平扩展性,支撑海量链路数据的聚合计算,生成结果会更加准确。缺点是实时性较差,聚合规则变更到新拓扑生成的周期较长。离线聚合通常用于全局拓扑数据的精确计算。

(三)预聚合

预聚合是一种理论上可行的拓扑生成方式,它的思路是从入口节点开始,不断向下透传全链路的完整调用路径信息,并在端侧生成相应的预聚合指标。不考虑透传信息的长度限制与端侧预聚合开销,这种方式的好处就是节省了在服务端将明细数据转化为拓扑数据的过程,实现又快又准的目标。但是缺陷就是不支持自定义规则,否则透传与预聚合的开销会直线上升,影响业务进程的性能与稳定性。预聚合的原理示意图如下所示。

在这里插入图片描述

04 3D 拓扑

流量与资源是一对“好兄弟”,二者密切相关。流量影响着资源分配,而资源反过来又约束着流量状态。大部分流量异常归根结底是资源配额不足或分配不合理导致的,比如峰值流量瞬间耗尽资源,或者流量不均导致的“热点”等。我们在定位流量异常根因的过程中,往往需要结合相对应的资源状态进行分析;反过来,当一个资源节点出现异常时,我们也希望知道它会影响其上运行的哪些流量?因此,在代表流量的链路拓扑上,关联相对应的资源数据,形成更加完整的 3D 拓扑,貌似是个不错的选择。

如下图所示,3D 拓扑不仅包含 PaaS 层的应用、接口流量节点状态与依赖,还可以下钻查看相对应的 IaaS 层进程、实例等资源状态。3D 拓扑为流量与资源建立了一个连接,帮助我们更直观的定位资源瓶颈引发的流量异常问题。

在这里插入图片描述

3D 拓扑以一种巧妙的方式传递了更多的信息,但是它也有一个非常致命的缺陷,就是信息密度过于集中。在复杂拓扑环境下,表现可能还不如 2D 拓扑来的直观,大大降低了它的实用价值。如下图所示,当实例规模达到数百,接口数量达到上千时,3D 拓扑交互上的复杂性显著降低了诊断排查的效率,更多用于大屏展示。

在这里插入图片描述

为了降低 3D 拓扑的交互成本,一种可能的思路是结合智能诊断技术,自动突出异常链路,精准收敛展示数据范围。不过,这对于技术与产品的要求较高,实用性还有待大量真实生产环境的检验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

反射~~~

文章目录 反射反射获取Class类对象反射获取构造器对象反射获取成员变量对象反射获取方法对象反射的作用绕过编译阶段为集合添加数据通用框架的底层原理 反射 反射获取Class类对象 getClass()方法为Object类中的成员方法 反射获取构造器对象 parametTypes为参数的类对象 获得类的…

智安网络|网络安全威胁越来越多,教你如何全方面应对

随着互联网的普及和发展,各大网站已经成为人们获取信息和交流的主要平台。然而,随着网络攻击和恶意软件的威胁不断增加,网站经常成为攻击者的目标。因此,在建立和维护网站系统时,必须采取强大的安全措施。 一、网站系…

阅读有感重庆rcgl

1.json转为对应的泛型集合 List<String> resourceList JSON.parseArray(JSON.toJSONString(obj), String.class); 2.集合转换为数组 String[] roles (String[])resourceList.toArray(new String[0]); 3.json转换为对应的javabean SLoginRule loginRule (SLoginRul…

【Web项目实战】从零开始学习Web自动化测试:用Python和Selenium实现网站登录功能

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 1.环境搭建 2.编写测试用例 3.运行测试用例 3.1 命令行方式 3.2 集成到CI/CD流程中 4.结论 Web自动化测…

Windows安装配置Tomcat服务器教程 ——外网远程访问

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 转载自cpolar文章&#xff1a;外网访问本地Tomcat服务器【cpolar内网穿透】…

ReadTimeoutError: HTTPSConnectionPool(host=‘files.pythonhosted.org‘, port=443)

问题&#xff1a; 今天在遇到了安装pytorch中的torchvision包的时候一直超时失败报错如下 ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out. 之前的安装的方式是&#xff1a; pip install --no-deps torchvision 解决办法&…

uni——模拟购物车(全选、全不选、步进器、结算等)

案例演示 案例代码 <template><pageBox ref="pagebox"><view class=

Java程序设计入门教程--案例:自由落体

程序模拟物体从10000米高空掉落后的反弹行为。 球体每落地一次&#xff0c;就会反弹至原高度的一半。按用户输入的弹跳次数&#xff0c;计算球体每次弹跳的高度。 实现过程&#xff1a; 1. 新建项目&#xff1b; 2. 接收 用户输入的弹跳次数&#xff1a; &#xff08;1&#…

通过Robotstudio修改机器人程序的具体方法和步骤

通过Robotstudio修改机器人程序的具体方法和步骤 基本步骤可参考以下内容: 用网线连接机器人和电脑,机器人一侧要插入LAN2口;机器人和电脑的IP地址要在同一个网段内;请求写入权限;修改程序—编译—应用;加载修改后的程序到机器人;保存Robotstudio程序到电脑端;只能修改…

超大规模视觉通用感知模型

超大规模视觉通用感知模型 通用感知模型简介与发展超大规模图像、文本主干网络多任务兼容解码网络 参考文献 通用感知模型简介与发展 通用感知模型是指一个模型解决不同的感知任务&#xff0c;应用于各种模态数据。 通用感知模型的发展脉络图如下&#xff0c;它由NLP发源&…

Visual Studio Code 和 GitHub Copilot

翻译自 Chris Dias 的博客 AI 这个话题&#xff0c;近期我们看到它被大家广泛地谈论&#xff0c;有些人很兴奋&#xff0c;也有些人表达了担忧。进步几乎每天都在发生&#xff0c;速度前所未有。每天有超过一百万的 Copilot 用户&#xff0c;如果你有机会尝试&#xff0c;你可…

简易英文统计和加密系统的设计实现(纯C语言实现,包含文件操作、注释多、易理解)

❤️作者主页&#xff1a;微凉秋意 &#x1f525;系列专栏&#xff1a;数据结构与课程设计 ✅作者简介&#xff1a;后端领域优质创作者&#x1f3c6;&#xff0c;CSDN内容合伙人&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3c6; 文章目录 前言部分功能、开发环境与项目结…

十二、模块化开发

一、什么是模块化&#xff1f; 到底什么是模块化、模块化开发呢&#xff1f; 事实上模块化开发最终的目的是将程序划分成一个个小的结构&#xff1b;这个结构中编写属于自己的逻辑代码&#xff0c;有自己的作用域&#xff0c;定义变量名词时不会影响到其他的结构&#xff1b;…

上海车展:油电反转,新能源车竞争白热化

还记得2009年的上海车展&#xff0c;新能源车初来乍到&#xff0c;一共才展出47辆&#xff0c;占所有展出车辆5.12%&#xff0c;今年参展车型中&#xff0c;传统燃油车型有58款&#xff0c;新能源车有76款&#xff0c;新能源车第一次超过燃油车&#xff0c;实现油电反转。 电动…

均值滤波 附带简易code

1.概念介绍  均值滤波是典型的 线性滤波算法&#xff0c;是指用当前像素点周围nxn个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点&#xff0c;可完成整幅图像的均值滤波。 2.基本原理  如图2-1&#xff0c;我们对第5行第5列的像素点进行均值滤波时…

D. Labyrinth(双端队列BFS)

Problem - D - Codeforces 你正在玩一款电脑游戏。其中一个关卡将你置于一个迷宫中&#xff0c;它由n行构成&#xff0c;每行包含m个单元格。每个单元格要么是空闲的&#xff0c;要么被障碍物占据。起始单元格位于第r行和第c列。在一步中&#xff0c;如果目标单元格没有被障碍物…

Codeforces-Round-826-Div-3-E-Sending-a-Sequence-Over-the-Network

title: Codeforces Round 826 (Div. 3) E. Sending a Sequence Over the Network date: 2023-04-18 20:04:57 categories: AlgorithmCodeforces tags:codeforces动态规划1600 E. Sending a Sequence Over the Network ​ 题目大意 给你一个长度为n的数组&#xff0c;问整个…

【Java 8 Time】Java8时区时间运用详解,2万字助你通关java.time包

目录 前言一、时区与时间1. 世界标准时&#xff1a;UTC、GMT、UT2. 地区时&#xff1a;Asia/Shanghai、UTC83. 时区&#xff1a;ZoneId、TimeZone4. 时间偏移量&#xff1a;ZoneOffset5. 时区简称&#xff1a;CTT、PRC 二、主要时间类1. 重要时间接口&#xff1a;Temporal2. 时…

测试用例覆盖不全面的解决方法

测试用例覆盖不全面的解决方法 问题分析 在测试用例设计过程中&#xff0c;容易出现思维受限或者需求盲区&#xff0c;我们不可能完全覆盖用户使用的所有场景&#xff0c;编写测试用例的时不可能把所有的场景都能想周全&#xff0c;把所有的场景下的情况都写成测试用例去模拟、…

SLAM论文速递:SLAM—— (2023)Amos-SLAM:一种基于视觉和几何的抗动态双阶段SLAM方法—5.05(1)

论文信息 题目&#xff1a; Amos-SLAM:An Anti-Dynamics Two-stage SLAM Approach Amos-SLAM:一种基于视觉和几何的抗动态双阶段SLAM方法论文地址&#xff1a; https://arxiv.org/pdf/2302.11747.pdf发表期刊&#xff1a; Computer Science > Robotics标签 xxxx 摘要 传统…