拨开迷雾:利用全链路消息跟踪揭示系统奥秘

news2025/1/20 3:52:21

在分布式系统,一次外部请求往往需要内部多个模块,多个中间件,多台机器的相互调用才能完成。在这一系列的调用中,可能有些是串行的,而有些是并行的,排查定位非常困难。

全链路消息分析及全链路消息跟踪可以帮助我们解决这个问题。基于全链路消息分析可以通过跟踪消息的完整传递路径,精确定位故障发生的位置和原因,缩小故障范围,并提高故障排查和调试的效率。全链路消息跟踪可以追踪和监控微服务之间的消息传递路径,为项目团队提供服务器节点定位、异常上下文信息收集、服务健康度监控/预警、关键业务逻辑执行过程追溯、业务过程分析、业务环节耗时跟踪预警等便捷的运维手段。

那什么是全链路消息跟踪?

PART.1 揭开全链路消息跟踪的神秘面纱

全链路消息(End-to-End Message),是指在某种业务在一套分布式系统中从发送方到接收方完整传递的、能描述业务全生命周期的消息。它包括了业务在系统中各环节的传递路径、消息内容和相关的上下文信息。全链路消息包含但不限于以下消息范围:

消息主要涵盖以下内容:

  • 消息传递路径:全链路消息跟踪记录消息从发送端到接收端的传递路径,包括经过的各个服务、组件和节点。
  • 消息状态和处理情况:全链路消息跟踪记录每个节点对消息的处理情况,包括成功、失败、异常等状态,以及处理过程中的关键信息和时间戳。
  • 上下文信息:全链路消息跟踪不仅追踪消息本身,还记录与消息相关的上下文信息,如请求参数、响应结果、异常信息等。

为了能够更好地管理和分析全链路消息的传递路径和状态,提供全面的消息监控和分析能力,以便于故障排查、性能优化和系统调试。

抽象链路消息主要包括:

  • 定义消息模型:通过定义消息的结构和属性,将消息抽象成一种可管理和分析的数据模型,使其具备可扩展性和灵活性。目前我们定义的大致有唯一标识、请求消息、响应消息、异常消息、应用节点信息(IP、端口、模块名称)、消息类型、业务类型和业务标识等信息,便于业务异常、系统异常的排查。
  • 唯一标识消息:为每个消息生成唯一标识符,以便跟踪和关联消息在系统中的传递和处理。
  • 标准化消息格式:制定一致的消息格式和协议,使不同组件和服务之间能够理解和解析消息,实现消息的抽象和互操作。

全链路消息跟踪(End-to-End Message Tracing)的目的就是记录和追踪这些消息在系统中的传递过程,以便实现对整个消息传递链路的可视化、监测和分析。

在一个完整的业务操作通常涉及多个服务之间的协作和消息传递,全链路消息可以跨越多个服务、中间件等组件,从发送方经过一系列中间节点,最终到达接收方。通过追踪全链路消息,可以了解消息在系统中的流动和处理过程,包括消息的发送时间、传递路径、中间节点的处理时间等信息。

外部系统进入到系统的时候,通常的日志记录只会到接口层面,即请求前后的出入参以及对应的耗时等。但是在全链路消息跟踪的设计模式下,接口请求的信息只是其中的一部分,还需要记录接口开始后到结束的中间的业务逻辑的消息,当然这个取决于各业务系统的颗粒度。

PART.2 实施全链路消息跟踪的四步骤

步骤一:数据链路分析

  • 确定数据源

首先需要明确业务系统中的数据源,包括输入数据的来源和输出数据的目的地。这可以包括数据库、API接口、消息队列、日志文件等。

  • 识别数据链路

根据业务系统的功能和数据流动情况,识别数据链路的各个环节和组件。这可以通过分析业务流程、系统架构图以及相关文档来进行。

  • 定义数据链路

为每个数据链路环节定义清晰的输入和输出数据,以及数据的转换和处理过程。明确每个环节之间的数据传递方式和规则。

  • 追踪数据流

通过合适的手段和工具,追踪业务系统中的数据流动。可以使用日志记录、消息队列监控、数据库查询等方式来获取数据流的详细信息。

  • 数据链路分析

基于追踪到的数据流信息,进行数据链路分析。这包括确定数据链路中的瓶颈、延迟、错误和数据丢失等问题。通过分析数据链路,可以找出导致问题的环节,并提供相应的优化和改进建议。

步骤二:数据流解析

在全链路消息跟踪中,数据流的跟踪和解析是一个关键步骤,数据流的跟踪通常通过在系统中埋点或拦截关键节点的方式实现。当消息经过这些节点时,会记录相关的信息,如消息的内容、时间戳、发送者和接收者等。这些信息可以被捕获和存储,用于后续的分析和追踪。

目前我们设计模式中有三种方式来进行链路数据的跟踪。

  • 基于日志的实现方法

基于日志的实现方法是消息全链路跟踪的一种常见方式。它通过在每个服务或组件中记录相关的日志信息来实现消息的跟踪和监控。下面是基于日志的实现方法的流程:

基于日志的实现方法相对简单且易于扩展,因为它借助于已经存在的日志记录机制和工具。然而,它也存在一些限制,如日志量的增加、日志传递的开销和跨服务边界的上下文传递等挑战。因此,在实际应用中,通常需要结合其他技术和方法,如注入式跟踪和集成式跟踪系统,来实现更全面和高效的消息全链路跟踪。

  • 基于注入的实现方法

基于注入的实现方法是消息全链路跟踪的另一种常见方式。它通过在消息传递路径上的每个服务或组件中插入代码来实现消息的跟踪和监控。下面是基于注入的实现方法的流程:

基于注入的实现方法具有较高的灵活性和精确度,因为它可以直接在代码中插入跟踪逻辑。然而,它也需要在每个服务或组件中进行修改和注入代码,对现有代码的侵入性较大。此外,注入的实现方法可能需要更多的开发工作和技术支持,以确保正确的跟踪逻辑和数据收集。

  • 基于AOP(面向切面编程)的实现方法

从前面两种实现方式来看,对于现有系统代码的侵入性相对都比较强,对于已经运营的生产系统来说不是最友好的方式,且定制化高,不易于扩展和维护。因此,就有了第三种实现方法——基于AOP的实现消息记录。

AOP通过将横切的信息收集点从业务逻辑中抽象出来,使得信息收集点的实现可以集中在一个地方,提高了代码的模块化和可维护性,减少代码冗余。其次,AOP使得信息收集点的配置和管理更加集中化,可以更方便地管理和修改信息收集点的实现。

基于AOP的实现方法,当然也有它特有的实现步骤:

通过基于AOP的实现方法,可以在关键的方法调用或消息传递上插入跟踪逻辑,实现消息全链路跟踪。这种方法具有较强的灵活性和可扩展性,可以适用于分布式系统。

步骤三:数据存储

在实现全链路消息跟踪时,存储和索引跟踪数据是关键的一步。存储和索引跟踪数据可以帮助实现对消息的快速检索、分析和查询,从而支持故障排查、性能优化和系统监控等任务。以下是采用的数据存储方式:

  • 数据库存储:每个消息可以作为一个记录,包含相关的字段(例如链路追踪标识符、时间戳、消息唯一标识、传递路径等)。使用数据库的查询功能可以对跟踪数据进行灵活的检索和分析。
  • 搜索引擎跟踪:为了支持快速的数据检索和查询,以及报文数据的模糊搜索,可以使用搜索引擎支持复杂数据的查询。我们使用Elasticsearch作为消息详细信息的存储引擎,和数据库存储结合,通过建立索引来加速对跟踪数据的查询。索引可以基于消息的关键字段(如链路追踪标识符、时间戳)进行构建,以便快速地定位和访问跟踪数据。

数据存储除了中间件的选型,还需要将数据存储的过程和业务系统做成解耦,避免降低业务系统正常功能的性能情况。

下图是存储数据的过程:

  • 首先通过埋点采集到数据后,可以将消息以【索引+全量的消息数据】的结构序列化存储到Redis缓存中;
  • 第二步同步把重要索引类信息封装成消息体投入到消息队列中;
  • 然后在消息存储应用中消费消息队列的消息,根据消息中的索引从Redis中获取实际的数据,写入到数据库以及Elastic Search中,完成链路消息的持久化。

步骤四:数据可视化

可视化跟踪数据是实现全链路消息跟踪的关键一步,它可以帮助开发人员和运维人员更直观地理解和分析消息传递的流程和性能。

  • 跟踪数据流程图:使用流程图工具(如Graphviz、Mermaid、AntV G6)可以绘制跟踪数据的流程图,展示消息在系统中的传递路径和中间节点的处理过程。
  • 时间轴和日志视图:通过在时间轴上展示跟踪数据的时间戳和事件顺序,可以更清晰地了解消息的传递顺序和时间间隔。日志视图可以展示每个消息的详细信息,包括消息内容、上下文和处理日志等。
  • 拓扑图和依赖关系图:使用拓扑图工具(如D3.js、Neo4j)可以绘制跟踪数据的拓扑图,展示服务之间的关系和依赖。

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

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

相关文章

C# 简单模拟 程序内部 消息订阅发布功能

文章目录 前言模拟消息订阅发布使用注意事项 前言 我想做个简单的消息发布订阅功能,但是发现好像没有现成的工具类。要么就是Mqtt这种消息订阅发布。但是我只想程序内部进行消息订阅发布,进行程序的解耦。那没办法了,只能自己上了 模拟消息…

yolo-v5学习(使用yolo-v5进行安全帽检测错误记录)

常见错误 跑YOLOv5遇到的问题_runtimeerror: a view of a leaf variable that requi_Pysonmi的博客-CSDN博客 python train.py --img 640 --batch 16 --epochs 10 --data ./data/custom_data.yaml --cfg ./models/custom_yolov5.yaml --weights ./weights/yolov5s.pt 1、梯度…

实例032 动画显示窗体

实例说明 当用户启动程序后,普通的程序窗口都是瞬间显示到屏幕上,这样未免有些生硬。如果窗口能够慢慢的展现在用户面前,将会是什么样的效果?本例设计的是一个动画显示的窗体,该程序运行后,窗体是慢慢的以…

小黑子—JavaWeb:第六章 - Filter、Listener、AJAX与JSON

JavaWeb入门6.0 1. Filter1.1 Filter快速入门1.2 Filter执行流程1.3 Filter拦截路径配置1.4 Filter过滤器链1.5 案例登录验证 2. Listener2.1 ServletContextListener使用 3. AJAX3.1 AJAX 快速入门3.2 案例 验证用户名是否存在3.3 Axios 异步框架3.3.1 Axios 快速入门3.3.2 Ax…

自动驾驶新方法登Nature封面:让黑夜如白昼般清晰,浙大博士一作

摘要: 通过克服传统解决方案中的“重影”问题,这种方法在基准测试中一显巨大优势,不仅能像白天一样看清环境的纹理和深度,还能感知到RGB、热视觉以外的各种物理信息,可谓相当利好机器感知尤其是自动驾驶行业。 利用AI…

Flink多流处理之connect拼接流

Flink中的拼接流connect的使用其实非常简单,就是leftStream.connect(rightStream)的方式,但是有一点我们需要清楚,使用connect后并不是将两个流给串联起来了,而是将左流和右流建立一个联系,作为一个大的流,并且这个大的流可以使用相同的逻辑处理leftStream和rightStream,也可以…

【Leetcode】(自食用)删除链表中倒数第k个结点

step by step. 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出&a…

Golang之路---04 并发编程——互斥锁和读写锁

互斥锁和读写锁 面对并发问题,我们始终应该优先考虑使用信道,如果通过信道解决不了的,不得不使用共享内存来实现并发编程的,那 Golang 中的锁机制,就是你绕不过的知识点了。 在 Golang 里有专门的方法来实现锁&#x…

【C++】哈希闭散列

一.哈希的概念 在前面学习了二叉搜索树、AVL树、红黑树之后,我们得知顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须经过关键码的多次比较。顺序查找的时间复杂度为 O(N)&#xff0c…

0.CLIP

目录 前言背景缘起/摘要数据集拟解决问题 精读IntroductionModel2.1自然语言监督2.2 创建一个有效的大数据集选择一个有效的预训练方法2.4 选择模型(选择Encoder)2.5训练小结 实验 复现(略) 前言 本课程来自深度之眼《多模态》训…

找免费商用的图片素材就上这6个网站。

分享6个免费商用的高清图片素材库,你想要找到这里都能找到,赶紧收藏起来吧~ 菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 网站主要是为新手设计师提供免费素材的,素材的质量都很高,类别也很多,像平面、UI…

Zhang-Suen骨架提取算法

前言 本专栏针对的目标物体为物体裂缝量化,提取裂缝的骨架有助于裂缝长度的求解,故这一篇也是本专栏的开篇。 细化算法选择与分析 裂缝骨架的提取是十分有必要,如果我们能够得到裂缝的骨架图那么就很容易获得整条裂缝的长度。在当前经典的…

机器学习深度学习——序列模型(NLP启动!)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——卷积神经网络(LeNet) 📚订阅专栏:机器学习&&深度…

地理信息系统空间分析实验教程 第三版 第八章示例与练习 学校选址

学校选址 背景 合理的学校空间位置布局有利于学生的上课与生活。学校的选址问题需要考虑地理 E八位置、学生娱乐场所配套设施、与现有学校的距离等因素,从总体上把握这些国素能够确定出适宜性比较好的学校选址区 目的 通过练习,熟悉 ArcGIS 栅格数据…

无涯教程-Perl - endnetent函数

描述 此功能告诉系统您不再希望使用getnetent从网络列表中读取条目。 语法 以下是此函数的简单语法- endnetent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perluse Socket;while ( ($name, $aliases, $addrtype, $net) getnetent() )…

VUE框架:vue2转vue3全面细节总结(3)路由组件传参

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人_python人工智能视觉(opencv)从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了: https://blog.csdn.net/lbcy…

element表格+表单+表单验证结合运用

目录​​​​​​​ 一、结果展示 二、实现代码 一、结果展示 1、图片 2、描述 table中放form表单,放输入框或下拉框或多选框等; 点击添加按钮,首先验证表单,如果存在没填的就验证提醒,都填了就向下添加一行表单表…

Redis中BigKey、HotKey的发现与处理

Redis中BigKey、HotKey的发现与处理 内容详情: 阿里云开发者社区(点击跳转) 参考自: https://developer.aliyun.com/article/788271?utm_contentm_1000291945#slide-1

【数据结构OJ题】删除有序数组中的重复项

原题链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 用双指针算法,定义两个变量src和dst,一开始让src和dst指向num[ ]数组的第一个元素&a…

Cadence学习

Cadence学习 Cadence内容涵盖Cadence主要功能Cadence功能模块Allegro Design Entry CIS 和 OrCAD Capture CIS 的区别Cadence 公司简介Allegro Design Entry CISOrCAD Capture CIS OrCAD中part和database part区别OrCAD中不同页面的连接关系应该怎么处理(1&#xff…