分布式链路追踪
文章目录
- 1、背景
- 2、微服务架构下的问题
- 3、链路追踪
- 4、核心概念
- 5、技术选型对比
- 6、zipkin
1、背景
随着互联网业务快速扩展,软件架构也日益变得复杂,为了适应海量用户高并发请求,系统中越来越多的组件开始走向分布式化,如单体架构拆分为微服务、服务内缓存变为分布式缓存、服务组件通信变为分布式消息,这些组件共同构成了繁杂的分布式网络。
2、微服务架构下的问题
在大型系统的微服务化构建中,一个系统会被拆分成许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。
上图为一个简单的下单系统,里面有n个微服务。现在用户在UI界面下单一个商品,但弹出错误提示"系统内部错误":
此时,开发运维人员要排查异常具体是由哪个微服务引起的就得去逐个看相关的服务日志,效率低下。
3、链路追踪
分布式链路追踪(Distributed Tracing) 就是将一次分布式请求还原成调用链路,进行日志记录、性能监控,并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等,以便帮助开发人员快速定位和解决分布式系统中的性能问题和故障。
链路跟踪主要功能:
-
故障快速定位:可以通过调用链结合业务日志快速定位错误信息。
-
链路性能可视化:各个阶段链路耗时、服务依赖关系可以通过可视化界面展现出来。
-
链路分析:通过分析链路耗时、服务依赖关系可以得到用户的行为路径,汇总分析应用在很多业务场景。
☀ 更多参考这篇:http://bigbully.github.io/Dapper-translation/
4、核心概念
概念1:trace
trace是要追踪的一个链路,即一个请求经过所有服务的路径,可以用下面树状的图形表示:
traceid串联起来,就形成了一条完成的链路。
概念2:span
从上面的trace链路可以看到,请求过来调用了服务A,服务A又调用了服务B和服务C,但先调用了B还是C并未标明,因此有了span这个概念。span表达了服务的调用顺序和调用关系。
- 同一层级parent id相同,span id不同,span id从小到大表示请求的顺序,因此服务A是先调用了服务B,再调服务C
- 上下层级代表调用关系,如图中服务C的span id为2,而服务D的parent id为2,这就表示服务C和服务D形成了父子关系,且是服务C调用服务D
到此,通过事先在日志中埋点,找出相同traceId的日志,再加上parent id和span id就可以将一条完整的请求调用链串联起来。
概念3:Annotations
Annotations 用于用户自定义事件,用来辅助定位问题。包含四个注解信息:
- cs:Client Start,表示客户端发起请求
- sr:ServerReceived,表示服务端收到请求
- ss:Server Send,表示服务端完成处理,并将结果发送给客户端
- cr:ClientReceived,表示客户端获取到服务端返回信息
上图中描述了一次请求和响应的过程,四个点也就是对应四个Annotation事件。如果要计算一次调用的耗时,只需要将客户端接收的时间点减去客户端开始的时间点,也就是图中时间线上的T4 - T1。如果要计算客户端发送网络耗时,也就是图中时间线上的T2 - T1:
概念4:采样
由于每一个请求都会生成一个链路,如果对每一个请求都进行数据采集和存储,性能损耗太大,因此使用采样的方式。比如每秒有1000个请求访问系统,设置了采样率为1/1000,那么只会上报一个请求到存储端。
概念5:埋点
埋点是指将链路追踪的代码插入到应用程序中,以便在应用程序执行期间收集所需的数据。这些数据通常包括系统调用和服务的名称,执行时间,响应时间和错误信息。通过分析这些数据,开发人员可以确定系统中哪些服务或系统调用是性能瓶颈,并确定它们对系统整体性能的影响。
概念6:存储
链路中的span数据经过收集和上报后会集中存储在一个地方,如BigTable数据仓库、ElasticSearch、 HBase、In-memory DB
5、技术选型对比
基于链路追踪的基本原理,各大厂商给出了各自的落地方案,如:
- Twitter的Zipkin
- Uber的Jaeger
- 韩国公司开发的pinpoint
- Apache开源的skywalking
- 阿里的鹰眼
- 美团的Mtrace
- 滴滴Trace
- 新浪的Watchman
- 京东的Hydra
- 大众点评的cat
关于技术选型,各项指标对比:
地址如下:
zipkin -> https://zipkin.io/Jaeger -> https://www.jaegertracing.io/Pinpoint -> https://github.com/pinpoint-apm/pinpointSkyWalking -> http://skywalking.apache.org/
6、zipkin
Zipkin 是 Twitter 的一个开源项目,基于 Google Dapper 实现,致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。
zipkin架构中,主要四部分:
- Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin 内部处理的 Span 格式,以支持后续的存储、分析、展示等功能
- Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中
- RESTful API:API 组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等
- Web UI:UI 组件,基于 API 组件实现的上层应用。通过 UI 组件用户可以方便而有直观地查询和分析跟踪信息
参考文章及图片来源:https://zhuanlan.zhihu.com/p/284181372
相关文章:

分布式链路追踪
文章目录 1、背景2、微服务架构下的问题3、链路追踪4、核心概念5、技术选型对比6、zipkin 1、背景 随着互联网业务快速扩展,软件架构也日益变得复杂,为了适应海量用户高并发请求,系统中越来越多的组件开始走向分布式化,如单体架构…...

计算机网络————网络层
文章目录 网络层设计思路IP地址IP地址分类IP地址与硬件地址 协议ARP和RARPIP划分子网和构造超网划分子网构造超网(无分类编址CIDR) ICMP 虚拟专用网VPN和网络地址转换NATVPNNAT 网络层设计思路 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数…...

el-table刷新后保持高亮并改变状态字段
一、需求: 1、点击左侧右边显示具体内容 2、点击右边确认 左侧依旧高亮并且改变启动状态颜色 3、点击刷新、重置、高级搜索等不高亮 右边也不显示具体内容 二、效果图: 三、具体实施 1、定义highlight-current-row 是否高亮行 <el-table ref&quo…...
ARM Ubuntu内核更新记录
1,系统版本说明:ARM 鲲鹏920 cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE18.04 DISTRIB_CODENAMEbionic DISTRIB_DESCRIPTION"Ubuntu 18.04.5 LTS" 2, 将source.list中的deb-src打开 # 默认注释了源码镜像以提高 apt…...
【sgUploadTray】上传托盘自定义组件,可实时查看上传列表进度
【sgUploadTray】上传托盘自定义组件,可实时查看上传列表进度 特性: 可以全屏可以还原尺寸可以最小化可以回到右下角默认位置支持删除队列数据 sgUploadTray源码 <template><div :class"$options.name" :show"show" :size…...

改进二进制粒子群算法在配电网重构中的应用(Matlab实现)【论文复现】
目录 0 概述 1 配电网重构的目标函数 2 算例 3 matlab代码实现 0 概述 配电系统中存在大量的分段开关和联络开关,配电网重构正是通过调整分段开关和联络升大的组合状态来变换网络结构,用于优化配电网某些指标,使其达到最优状态。正常运行时,则通…...

【文章系列解读】Nerf
1. Nerf NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 2020年8月3日 (0)总结 NeRF工作的过程可以分成两部分:三维重建和渲染。(1)三维重建部分本质上是一个2D到3D的建模过程ÿ…...

基于springboot,vue网上订餐系统
开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 前端技术 :VueElementUI 服务端技术:springbootmybatisredis 本系统分用户前台和管理后台两部分,项…...
Nautilus Chain 更换全新测试网,主网即将在不久上线
目前,Nautilus Chain 正在为主网上线前的最后阶段做准备,据悉该链更新了全新的测试网,在此前版本的测试网的基础上进行了全新的技术升级,最新测试网版本与生态发展的技术规划更为贴近。本次测试网升级将会是最后一次测试网版本的迭…...
攻防世界web:Web_php_wrong_nginx_config,python3后门
网上的wp中关于Web_php_wrong_nginx_config的后门代码都是python2的(源码来自:Weevely:一个 PHP 混淆后门的代码分析 - Phukers Blog) 以下是转换成python3的版本 # encoding: utf-8from random import randint, choice from ha…...

【VUE】解决图片视频加载缓慢/首屏加载白屏的问题
1 问题描述 在 Vue3 项目中,有时候会出现图片视频加载缓慢、首屏加载白屏的问题 2 原因分析 通常是由以下原因导致的: 图片或视频格式不当:如果图片或视频格式选择不当,比如选择了无损压缩格式,可能会导致文件大小过大…...

spring复习:(35)在getBean时,在哪里根据普通bean和工厂bean进行区分处理来返回的?
在AbstractBeanFactory的doGetBean方法: 调用的getObjectForBeanInstance方法部分代码如下: 如果不是工厂bean,则直接将实例返回,否则调用getObjectFromFactoryBean方法获取工厂bean的getObject方法返回的对象 protected Object getObjectF…...

Jenkins全栈体系(二)
Jenkins 第三章 Jenkins Git Maven 自动化部署配置 十、几种构建方式 快照依赖构建/Build whenever a SNAPSHOT dependency is built 当依赖的快照被构建时执行本job 触发远程构建 (例如,使用脚本) 远程调用本job的restapi时执行本job job依赖构建/Build after other proj…...

c++11 标准模板(STL)(std::basic_istream)(九)
定义于头文件 <istream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的…...

OpenSource - Spring Startup Ananlyzer
文章目录 🚀Optimization of Spring Startup核心能力📈Spring应用启动数据采集报告应用启动时长优化 📈Spring应用启动数据采集报告安装jar包配置项应用启动自定义扩展 🚀应用启动时长优化支持异步化的Bean类型接入异步Bean优化 开…...

ES6迭代器、Set、Map集合和async异步函数
目录 迭代器 Iterator 的作用 Iterator 的遍历过程 Set Map集合 map和对象区别? async异步函数 迭代器 迭代器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口&…...

mac android studio设置跟mac系统一样的快捷键
mac版的android studio 跟mac系统的快捷键不一样,主要修改了下面几组操作,为了跟mac系统快捷键相同 setting->Keymap 搜索bottom 修改3个快捷键: cmd↓ 设置让鼠标移动到屏幕最后面 shiftcmd↓ 选中从当前位置到屏幕最下面 option↓. 或者 end 滚动到屏幕最下方 // 因为默认…...

Java-通过IP获取真实地址
文章目录 前言功能实现测试 前言 最近写了一个日志系统,需要通过访问的 IP 地址来获取真实的地址,并且存到数据库中,我也是在网上看了一些文章,遂即整理了一下供大家参考。 功能实现 这个是获取正确 IP 地址的方法,可…...
Java代码实现word转PDF
import com.spire.doc.Document; import com.spire.doc.FileFormat; import lombok.extern.slf4j.Slf4j; public class WordConvertPdf { /** * word转pdf * param wordPathName word文件路径及名称 * param pdfPathName pdf生成路径及名称 */ public static void wordToPdf(…...
Java设计模式-简单工厂(Simple Factory)模式
介绍 简单工厂(Simple Factory)模式,又称为静态工厂方法(Static Factory Method)模式。 由一个工厂类来创建具体产品,即创建具体类的实例。 简单工厂模式从概念上涉及三个角色: 抽象产品角色…...

爬虫学习记录day1
什么是逆向? 数据加密 参数加密 表单加密扣js改写Python举例子 4.1 元素:被渲染的数据资源 动态数据 静态数据 如果数据是加密的情况则无法直接得到数据 4.2 控制台:输出界面 4.3 源代码页面 4.4 网络:抓包功能,获取浏…...
计算机二级Python考试的核心知识点总结
以下是计算机二级Python考试的核心知识点总结,结合高频考点和易错点分类整理: 1. **数据类型与运算** ▷ 不可变类型:int, float, str, tuple(重点区分list与tuple) ▷ 运算符优先级:** > * /…...
MySQL 索引失效:六大场景与原理剖析
我们都熟知索引是优化 MySQL 查询性能的利器。但你是否遇到过这样的困境:明明在表上建立了索引,查询却依然缓慢,EXPLAIN 分析后发现索引并未被使用?这就是所谓的“索引失效”。 索引失效并非一个 Bug,而是 MySQL 查询…...
OD 算法题 B卷【水果摊小买卖】
文章目录 水果摊小买卖 水果摊小买卖 小王手里有点闲钱,想做点水果买卖,给出两个数组m, n, m[i]表示第i个水果的成本价,n[i]表示第i个水果能卖出的价格;假如现在有本钱k,试问最后最多能赚多少钱࿱…...

【C++系列】模板类型特例化
1. C模板类型特例化介绍 定义:模板类型特例化(Template Specialization)是C中为模板的特定类型提供定制实现的机制,允许开发者对通用模板无法处理的特殊类型进行优化或特殊处理。 产生标准: C98/03…...

怎么让自己ip显示外省?一文说清操作
在互联网时代,IP地址不仅关联网络连接,还可能影响IP属地显示。那么,手机和电脑用户怎么让自己IP显示外省?一文说清操作要点。 二、4种主流方法详解 要让自己的IP显示为外省地址,主要有以下几种方法: …...

华为OD机考-内存冷热标记-多条件排序
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextInt();int[] arr new int[a];for(int…...
机器学习14-迁移学习
迁移学习学习笔记 一、迁移学习概述 迁移学习是机器学习中的一个重要领域,它旨在解决当目标任务的训练数据有限时,如何利用与目标任务相关但不完全相同的源任务数据来提高学习性能的问题。在现实世界中,获取大量高质量的标注数据往往成本高…...
用Ai学习wxWidgets笔记——在 VS Code 中使用 CMake 搭建 wxWidgets 开发工程
声明:本文整理筛选Ai工具生成的内容辅助写作,仅供参考 >> 在 VS Code 中使用 CMake 搭建 wxWidgets 开发工程 下面是一步步指导如何在 VS Code 中配置 wxWidgets 开发环境,包括跨平台设置(Windows 和 Linux)。…...

[概率论基本概念4]什么是无偏估计
关键词:Unbiased Estimation 一、说明 对于无偏和有偏估计,需要了解其叙事背景,是指整体和抽样的关系,也就是说整体的叙事是从理论角度的,而估计器原理是从实践角度说事;为了表明概率理论(不可…...