分布式系统下调用链追踪技术面试题
作者:Q.E.D 发布时间:2023-11-25 05:55:00
引言
一个复杂的分布式系统,用户发起一个请求,这个请求可能调用几十到几百个服务,经过很多业务层,而每个业务又是多个机器集群,一个请求具体被随机到哪台机器上又无法确定,如果最后用户的请求失败,只返回一个错误提示,作为开发人员,该如何定位解决问题?你需要定位以下问题:
问题出在哪个服务,是你负责的服务还是调用别人服务的某一个环节。
同一个服务集群有多台机器,到底要去哪个机房哪台机器定位某条报错信息。
同一个接口可能有多次请求,到底是哪一次报错了。
多个服务之间调用顺序是怎样的。
如果需要响应速度优化,到底是哪个环节哪个服务耗时了,如何定位。
1、面试官:
分布式微服务环境下那么多机器,调用链又很长,你们是如何定位问题的?
问题分析:这个问题,如果你使用过微服务框架,对于服务治理你一定知道这种技术,如果作为微服务架构的小白,你只是知道一些基础知识,突然被问到这个问题,确实比较懵逼。这么多机器集群,我怎么知道每次服务打到哪个机器上了,我怎么知道到底是哪个环节抛异常了?
我:分布式系统中针对上述问题,我们急需一套链路追踪(Trace)系统来解决这些痛点,这个系统主要的任务就是收集各服务的日志,上报日志,分析日志,保存展示。其关键核心在于调用链,为每个请求生成全局唯一的ID(Traceld),通过Traceld 将不同系统的“孤立地”调用信息关联在一起,还原出更多有价值的数据。
(如果你还不明白到底怎么搞直接看看成品图)
通过一个Trace查询某一次请求,这个Trace是全剧唯一,通过这个链路追踪系统,你可以清楚的知道服务调用深度,涉及服务个数,每个服务调用的时间及状态,到底是哪个服务出现异常,具体到方法名,查找耗时长的链路时,可以通过在查询结果页面点击“耗时”二字,让数据以耗时升序或降序排列,都一目了然,上面的问题都得到解决了。
2、面试官:
你知道哪些成熟的调用链开源工具?
Google Dapper
Dapper一开始是一个自包含的跟踪工具,但后来发展成为一个监控平台,具有高性能,代码侵入性低,支持集群扩展特性。
dapper 处理日志分为3个阶段:
各个服务将span数据写到本机日志上;
dapper守护进程进行拉取日志文件,将文件读到dapper收集器里;
dapper收集器将结果写到bigtable中,一次跟踪被记录为一行。
阿里巴巴的分布式调用跟踪系统 - 鹰眼(EagleEye)
EagleEye 是一个以调用链追踪技术为核心的监控系统,通过收集,存储,分析分布式系统中的调用事件参数,协同开发人员进行故障定位,容量预估,性能瓶颈定位,系统请求链路梳理等,EagleEye 的开发也是基于Google Dapper 的设计思想。
图片来源:github EagleEye 社区
美团分布式会话追踪系统 - MTrace
MTrace是美团点评内部的分布式会话跟踪系统,也借鉴了2010年Google的 dapper,通过一个全局的ID将分布在各个服务节点上的同一次请求串联起来,还原原有的调用关系、追踪系统问题、分析调用数据、统计系统指标,MTrace支持美团内部RPC中间件,HTTP中间件,MySQL,Tair,MQ等中间件的数据埋点。
复杂网络环境中定位问题,通过异常log绑定记录,轻松定位。
发现热点,发现瓶颈问题。
预估系统容量,按照上下游调用比例,粗略计算哪些机器需要提前扩容。
优化链路,通过链路分析,从更高的全局角度分析可以优化的点。
来源:https://blog.csdn.net/qq_34272760/article/details/120806120


猜你喜欢
- 基本思想归并排序采取分治的思想进行排序,借用一张图片说明一下将n个元素从中间切开,分成两部分。(左边可能比右边多1个数) 将步骤1分成的两部
- 生成的Android应用APK文件最好进行优化,因为APK包的本质
- http interface从 Spring 6 和 Spring Boot 3 开始,Spring 框架支持将远程 HTTP 服务代理成带
- 一、修改ReadOnly属性1、设置整个DataGridView只读:DataGridView.ReadOnly=true;此时用户的新增行
- 本文介绍Android平台进行数据存储的五大方式,分别如下:1 使用SharedPreferences存储数据2 文件存储数据 &
- C#编写的简单数字图像处理程序,数字图像处理的平时成绩和编程作业竟然占50%,那就把最近做的事写个札记吧。先放个最终做成提交的效果看看:1.
- 项目结构:pom.xml文件: <parent>
- 线程中断:void interrupted()方法:中断线程,例如,当线程A运行时,线程B可以调用线程A的interrupted()方法来设
- 前言Android模拟用户点击。在自动化测试中可使用的工具。可以利用adb命令,也可以使用Android SDK中的monkeyrunner
- 问题(1)重入锁是什么?(2)ReentrantLock如何实现重入锁?(3)ReentrantLock为什么默认是非公平模式?(4)Ree
- .net内存回收与Dispose﹐Close﹐Finalize方法一. net的对象使用一般分为三种情况﹕1.创建对象2.使用对象3.释放对
- springboot默认的打包方式为jar包,jar包的有优点是不需要更改的配置,并且内嵌了tomcat,如果打成jar包直接可以丢到doc
- 目录前言基本概念实践1. 首先准备一个控制台小程序2. 编写使用 AppDomain 的程序一些思考1. 为什么不使用 AppDomain
- 前言一直对它们之间的关系感到好奇,SpringBoot既然是Spring的封装,那么SpringBoot在初始化时应该也会有Bean的加载,
- 1.创建动画控制器,双击打开动画控制器,创建 状态并添加动画片段,并且状态与状态之间进行连线,往返的都要有,在Animator的左上角–Pa
- 1.本系统和现在有的考试系统有以下几种优势:a.和现在有的系统比较起来,本系统有科目、章节、老师、学生、班级等信息的管理,还有批阅试卷查看已
- C#实现委托namespace Delegate{ delegate void DGSayiHi(string n
- 关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间。在应用中我们会需要使用redis设置过期时间,比如单点登
- 目录前言Maven依赖代码前言在工作中是否会遇到实用websocket客户端连接服务端的时候,网络波动,服务端断连的情况。会导致客户端被动断
- 首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能。下篇再仔细讲讲为什么要这么写。效果图:实现了三个