当前位置: 首页 > news >正文

分布式链路追踪——Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

要解决的问题

  1. 如何记录请求经过多个分布式服务的信息,以便分析问题所在?
  2. 如何保证这些信息得到完整的追踪?
  3. 如何尽可能不影响服务性能?

追踪

在这里插入图片描述

当用户请求到达前端A,将会发送rpc请求给中间层B、C;B可以立刻作出反应,但是C需要后端服务D、E的配合才能应答

一个简单有用的请求追踪应该包含发送、接收消息的消息标识符、时间戳。为了关联给定发起者的这些记录,在此有黑盒和基于标注的监控模式

  • 黑盒:假定并没有除了以上记录之外的额外信息,使用统计回归进行推断关联性。

    更加轻量化,但是需要更多数据以保证准确性

  • 基于标注:基于应用或者中间件去显式采用全局标识符标注这些记录,从而关联。

    需要代码侵入,但可以将之植入到通用组件中

追踪信息

  • span: 链路追踪的基本单元,以追踪树结构串联起来。
  • trace id: 对于每一个请求链路上的span都有唯一的trace id

在这里插入图片描述
在这里插入图片描述

度量点

  • 当一个线程处理追踪控制路径时,dapper附加追踪上下文到本地线程储存中
  • 当异步处理时,dapper保证异步回调将会储存追踪上下文到创建者,并且当回调调用时将会关联到适当的线程
  • 植入到rpc通信中

采样收集

在这里插入图片描述

  1. 写入span数据到本地log文件
  2. dapper拉取各主机数据
  3. 最终写入到dapper bigtable

bigtable中每个trace置于表行,每个span置于表列

收集模式

Dapper采用out-of-band进行追踪收集,主要因为

  • in-band收集模式追踪数据在rpc响应头中,会动态影响应用网络
  • in-band收集模式假定rpc调用完美嵌套的,

in-band: 将追踪数据随着调用链进行传送

out-of-band: 通过其他链路进行追踪

收集方式

  • 基于日志:也即将trace、span等信息直接输出到应用日志中,而后汇集所有节点日志,最后推断出完整调用关系

    对网络消息没有侵入,对应用也只有少量侵入,但日志本身并不追求绝对连续与一致性,这意味着追踪结果可能并不准确

  • 基于服务:通过某些手段给目标应用注入追踪探针。探针在结构上可视为一个寄生在目标服务身上的小型微服务系统,它一般会有自己专用的服务注册、心跳检测等功能,有专门的数据收集协议,把从目标系统中监控得到的服务调用信息,通过另一次独立的 HTTP 或者 RPC 请求发送给追踪系统。

    因此,基于服务的追踪会比基于日志的追踪消耗更多的资源,也有更强的侵入性,换来的收益是追踪的精确性与稳定性都有所保证,不必再依靠日志归集来传输追踪数据。

  • 基于边车代理:用于服务网格,应用透明、语言无关、独立通道

性能损耗如何降低?

追踪系统的成本可分为追踪数据生成,追踪数据收集以及追踪数据分析组成。而收集和分析在紧急的时候是可以关闭的,因此追踪生成就成了最关键的损耗

而追踪生成的损耗最关键的则是运行时库创建和销毁span以及annotation,和写入log到硬盘中

写入硬盘合并了多个日志文件写入操作,并异步进行,有效地减少了由于写入log到硬盘造成的性能损耗

此外,dapper还发现

在这里插入图片描述

从图中可以看到随着采样频率的降低,延时和吞吐量都有性能上的提升。尤其是1/1024的频率下,对吞吐量的影响只有万分之六,而对延时的影响也只有千分之二。

这意味着是不是可以降低采样频率来降低对性能的影响呢?事实上是可以的,即使是降低到1/1024对于大型系统而言仍然有足够的数据进行追踪。

除了对于延时、吞吐量的影响,对于数据储存规模的影响,dapper也做了相应控制。

其使用二阶采样控制数据量大小。通过将traceID hash为0到1之间的度量z,若z小于采用参数,则将采样该数据,写入到bigtable中

总结

  1. 如何记录请求经过多个分布式服务的信息,以便分析问题所在?

    从上文可知通过引入span和trace分别从被追踪者和请求链路两个维度,推断追踪树,从而用于分析问题

  2. 如何保证这些信息得到完整的追踪?

    只要采样的绝对数量够大,那么就比较好追踪。对于分布式的情况,通过span组织的逻辑链路来达成;对于异步,关联到相关的线程;

  3. 如何尽可能不影响服务性能?

    分析收集可以通过动态的开关来保证紧急情况下的性能稳定,而追踪主要是通过尽量减少采样保证的

Ref

  1. https://storage.googleapis.com/pub-tools-public-publication-data/pdf/36356.pdf
  2. http://icyfenix.cn/distribution/observability/tracing.html

相关文章:

分布式链路追踪——Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

要解决的问题 如何记录请求经过多个分布式服务的信息,以便分析问题所在?如何保证这些信息得到完整的追踪?如何尽可能不影响服务性能? 追踪 当用户请求到达前端A,将会发送rpc请求给中间层B、C;B可以立刻作…...

【IEEE会议】第二届IEEE云计算、大数据应用与软件工程国际学术会议 (CBASE2023)

第二届IEEE云计算、大数据应用与软件工程国际学术会议 (CBASE2023) 随着大数据时代的到来,对数据获取的随时性和对计算的需求也在逐渐增长。为推动大数据时代的云计算与软件工程的发展,促进该领域学术交流,在CBASE 2022成功举办的…...

Streamlit项目:基于讯飞星火认知大模型开发Web智能对话应用

文章目录 1 前言2 API获取3 官方文档的调用代码4 Streamlit 网页的搭建4.1 代码及效果展示4.2 Streamlit相关知识点 5 结语 1 前言 科大讯飞公司于2023年8月15日发布了讯飞认知大模型V2.0,这是一款集跨领域知识和语言理解能力于一体的新一代认知智能大模型。前日&a…...

[Vue]解决npm run dev报错node:internal/modules/cjs/loader:1031 throw err;

解决: 有2中方法,建议先尝试第一种,不行再第二种 第一种: 重新安装依赖环境 删除项目的node_modules文件夹,重新执行 # 安装依赖环境 npm install# 运行 npm run dev 我只用了第一种方法就可以了 ,第二种方法从别的博主那看到…...

nginx反向代理后实现nginx和apache两种web服务器能够记录客户端的真实IP地址

一.构建环境 二.配置反向代理 1.基于源码安装的nginx环境下修改nginx.conf(设备1) 2.通过windows powershell进行修改hosts文件并测试 3.设备2和设备3上查看日志,可以看到访问来源都是代理服务器(2.190)而不是真实…...

【仿写tomcat】四、解析http请求信息,响应给前端,HttpServletRequest、HttpServletResponse的简单实现

思考 在解析请求之前我们要思考一个问题,我们解析的是其中的哪些内容? 对于最基本的实现,当然是请求类型,请求的url以及请求参数,我们可以根据请求的类型作出对应的处理,通过url在我们的mapstore中找到se…...

FL Studio21.1中文完整版Win/Mac

FL Studio All Plugins Edition【中文完整版 Win/Mac】适合音乐制作人/工作室使用,全套插件!(20.9新增Vintage Chorus,Pitch Shifter变调插件)FL Studio是超多顶级音乐人的启蒙首选!包括百大DJ冠军Martin Garrix&…...

基于Mysql+Vue+Django的协同过滤和内容推荐算法的智能音乐推荐系统——深度学习算法应用(含全部工程源码)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境MySQL环境VUE环境 模块实现1. 数据请求和储存2. 数据处理计算歌曲、歌手、用户相似度计算用户推荐集 3. 数据存储与后台4. 数据展示 系统测试工程源代码下载其它资料下载 前言 本项目以丰富的网易云音乐数据为基…...

Python Web开发 Django 简介

今天来为大家介绍 Python 另一个 Web 开发框架 Django,它是一个基于 Python 定制的开源 Web 应用框架,最早源于一个在线新闻 Web 网站,后于2005年开源。Django 的功能大而全,它提供的一站式解决的思路,能让开发者不用在…...

HAproxy搭建web集群

目录 一、HAproxy 概述 二、HAproxy 主要特性 三、HAproxy 负载均衡策略(八种) 四、LVS、Nginx、HAproxy区别 Nginx LVS HAproxy 五、HAproxy部署实战 问题总结: 一、HAproxy 概述 HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理&#xff0…...

临时用工小程序:一款便捷的用工管理软件

随着企业对人力资源需求的不断增长,临时用工需求也日益旺盛。为了满足这一需求,我们研发了一款名为“临时用工小程序”的软件系统,旨在帮助企业实现临时用工的高效管理。 一、技术栈介绍 后端技术栈 本系统采用Java语言作为开发语言&#…...

Android Studio 之 Android 中使用 HanLP 进行句子段落的分词处理(包括词的属性处理)的简单整理

Android Studio 之 Android 中使用 HanLP 进行句子段落的分词处理(包括词的属性处理)的简单整理 目录 Android Studio 之 Android 中使用 HanLP 进行句子段落的分词处理(包括词的属性处理)的简单整理 一、简单介绍 二、实现原理…...

CSDN编程题-每日一练(2023-08-20)

CSDN编程题-每日一练(2023-08-19) 一、题目名称:等差数列二、题目名称:喜水青蛙三、题目名称:括号匹配一、题目名称:等差数列 时间限制:1000ms内存限制:256M 题目描述: 给定一已排序的正整数组成的数组,求需要在中间至少插入多少个数才能将其补全成为一等差数列。 “…...

大数据:NumPy进阶应用详解

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教…...

new String创建几个对象

在java17中 : 问题1:new String("abc")会产生多少个对象? 分两种情况: 情况1: 如果”abc”这个字符串常量不存在,则创建两个对象,分别是“abc”这个字符串常量,以及ne…...

【路由协议】使用按需路由协议和数据包注入的即时网络模拟传递率(PDR)、总消耗能量和节点消耗能量以及延迟研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

c#实现依赖注入

当谈到C#中的依赖注入(Dependency Injection,DI)时,我们可以使用一个简单的示例来说明它是如何工作的。依赖注入是一种设计模式,用于将依赖关系从一个类传递到另一个类,以实现松耦合和可测试性。 假设我们有一个简单的订单处理应用程序,其中包含两个主要类:OrderServi…...

算法通关村十一关 | 位运算实现加法和乘法

1.位实现加法和乘法 在计算机中,位运算的效率要比加减乘除的效率更高,因此在高性能软件中源码中大量使用,计算机里各种运算基本上都是位运算。 学习下面内容之前建议先学习位运算规则:算法通关村十一关 | 位运算的规则_我爱学算…...

C++笔记之条件变量(Condition Variable)与cv.wait 和 cv.wait_for的使用

C笔记之条件变量(Condition Variable)与cv.wait 和 cv.wait_for的使用 参考博客:C笔记之各种sleep方法总结 code review! 文章目录 C笔记之条件变量(Condition Variable)与cv.wait 和 cv.wait_for的使用1.条件变量&…...

Dubbo之DubboBootstrap源码解析

功能描述 DubboBootstrap是Dubbo的启动类,包含服务启动、初始化、预处理配置、销毁清理等核心功能 功能分析 核心DubboBootstrap类分析 主要成员变量分析 private static volatile DubboBootstrap instance; //缓存者启动类的实例对象,以static形式…...

终极指南:如何使用QobuzDownloaderX-MOD免费下载Qobuz无损音乐

终极指南:如何使用QobuzDownloaderX-MOD免费下载Qobuz无损音乐 【免费下载链接】QobuzDownloaderX-MOD Downloads streams directly from Qobuz. Experimental refactoring of QobuzDownloaderX by AiiR 项目地址: https://gitcode.com/gh_mirrors/qo/QobuzDownlo…...

口碑好的底盘养护揭秘

常见汽车底盘问题及危害分析一、底盘异常的典型表现经常用车的朋友可能都遇到过类似情况:方向盘明明回正,车辆却自动偏向一侧,必须用力握紧才能保持直行;轮胎行驶里程不多,但一侧花纹已磨光,另一侧却还很深…...

加入收藏!小白程序员也能抓住的AI高薪机遇,大厂都在布局!

近期大厂纷纷成立AI部门,加大对AI的投入,预示AI已成为核心发展方向。AI技术正渗透工作生活,带来大量高薪岗位机会。无论技术岗或非技术岗,AI大模型应用开发等岗位年薪可达70万。AI岗位薪资高因需求大、供给少。随着AI技术成熟&…...

【Ultralytics】「6」整体架构设计:从引擎层到模型层的分层解耦

Ultralytics YOLO 框架采用四层分治架构,将系统自顶向下划分为 API 门面层、引擎协议层、模型特化层和神经网络构建层。每一层仅依赖其直接下层,通过属性多态(task_map)和延迟加载(__getattr__)实现层间解耦…...

观察 Taotoken 账单明细如何实现项目成本的精准分摊

观察 Taotoken 账单明细如何实现项目成本的精准分摊 对于技术团队负责人或项目管理者而言,大模型 API 的调用成本管理是一个既重要又繁琐的课题。当多个项目、不同团队共享同一个模型服务池时,如何清晰地追溯每一笔花费的来源,并将其准确地分…...

【AISMM落地生死线】:为什么83%的企业误读Level 3达标信号?——基于17份真实报告的逆向归因分析

更多请点击: https://intelliparadigm.com 第一章:AISMM模型评估报告解读会 AISMM(AI-Driven Software Maturity Model)是一套面向生成式AI工程化落地的成熟度评估框架,聚焦模型可解释性、推理稳定性、安全对齐性与运…...

MelonLoader:Unity游戏模组加载器的5个关键问题与解决方案

MelonLoader:Unity游戏模组加载器的5个关键问题与解决方案 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader MelonLoa…...

3分钟永久备份QQ空间:GetQzonehistory完整历史说说导出指南

3分钟永久备份QQ空间:GetQzonehistory完整历史说说导出指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否还记得那些年发过的QQ空间说说?那些深夜的感慨…...

Flowable工作流核心表结构全解析:从ACT_RE到ACT_HI,看完这篇就懂了

Flowable工作流引擎核心表结构深度解析:从数据视角掌握流程运转机制 1. 工作流引擎的数据架构设计哲学 现代BPM系统的核心在于如何高效管理流程状态与历史轨迹,Flowable通过精心设计的表结构实现了这一目标。与大多数开发者仅关注API调用不同&#xff0c…...

LuaDec51终极指南:快速掌握Lua 5.1字节码反编译的完整方法

LuaDec51终极指南:快速掌握Lua 5.1字节码反编译的完整方法 【免费下载链接】luadec51 Lua Decompiler for Lua version 5.1 项目地址: https://gitcode.com/gh_mirrors/lu/luadec51 你是否曾经面对一个加密的Lua字节码文件,却束手无策&#xff1f…...