热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

链路追踪(一)分布式链路追踪系统的介绍

一、分布式链路追踪可以做什么?1.1:简单集群架构&微服务架构 先来看下最简单的网站集群架构图:图1在这个图里,存在从1~n个服务器,通过负载均衡器

一、分布式链路追踪可以做什么?

1.1:简单集群架构&微服务架构 

先来看下最简单的网站集群架构图:

链路追踪(一)-分布式链路追踪系统的介绍

图1

在这个图里,存在从1~n个服务器,通过负载均衡器SLB进行请求分发,在每个服务器里,都做同一件事情。

现在来看下这个系统的具体业务逻辑(就是图1中每台服务器执行的逻辑,这里是假设其中一个业务接口的处理,真实系统中可能存在n多业务接口):

链路追踪(一)-分布式链路追踪系统的介绍

图2

图2是对系统中某一个接口(API)的逻辑做了描述,假设处理流程就是请求一次Redis服务,然后做下处理,然后再请求下Memecached服务,在做下业务处理,后续可能还有其他各种业务逻辑,我们统称为逻辑块。

现在假设这个接口存在性能问题,那么找对应开发负责人排查是比较容易的,因为服务器只执行一套逻辑,瓶颈点一定发生在当前接口对应代码里的某个点,那么就找接口对应的负责人去排查优化即可。

但是当业务发展到一定的程度,比如上述单系统逻辑越来越复杂(业务接口越来越多,逻辑越来越复杂),就会造成很多我们不愿意看到的问题发生:

每一次微小的改动都需要整体走一次打包、发版的流程,对测试也是种负担,因为n多个人如果同时开发不同的功能,这时候就会对测试和发布流程造成很大的困扰。

如果因为做某次活动,某一个接口可能引入大量请求,需要紧急扩容,那么只能对整体扩容(因为该接口与其他接口都处于同一个系统中)。

系统各模块高度耦合,不适合多人开发和维护。

 

简单集群带来的问题会随着系统复杂度的提升,维护成本变得越来越大,基于此,便有了微服务架构(微服务是一种架构思想,简单来说就是将复杂庞大耦合度高的系统按照功能特性拆分成一个个独立的系统,通过网络互相通信,这种架构可以借助RPC框架(比如grpc、dubbo)实现拆分。当然,熟悉的HTTP框架也可以做到(比如okhttp),但是受限于HTTP协议,性能可能并没有普通RPC框架高,比如grpc采用HTTP2应用层协议进行编解码,这个协议相比HTTP1来说,支持数据流的标记,可以在一个长连接上做N多请求和接收的并发处理,属于全双工网络通信,这点放到HTTP1就很难做到)。

结合图2,我们来简单按照业务划分一下服务,可以将A代码块里的逻辑抽象成A服务,将B代码块里的逻辑抽象成B服务,当然还有可能有其他n多细化的服务,网关层API(负责聚合信息以及业务处理的模块,对应上面简单集群里的具体接口),服务注册与发现、SLB等。

下面再来看一下被拆分后的架构图:

链路追踪(一)-分布式链路追踪系统的介绍

图3

这张图是一个很简单的微服务化的架构图,图中虚线部分都是在各服务启动时或者运行期发生的调用,负责注册与发现(如zookeeper、Eurake等都可以作服务注册与发现,这里不再细说,只关注实线部分即可)。

这种架构很好的解决了普通集群架构带来的问题(参考上述①、②、③),微服务架构的好处:

降低了系统(逻辑块)间的耦合度,可以独立开发、独立部署和测试,系统间的边界明确,可以细分相关负责人,开发效率大大提升。

如果因为做某次活动,某一个接口可能引入大量请求,需要紧急扩容,那么只需要将该接口涉及到的服务进行扩容即可,而不是像之前那样整体扩容,降低了维护成本(某种意义上的降低,维护人员要足够多,每个人去负责自己的小模块,如果一个公司只有一个维护人员,微服务反而是在加重维护人员的工作:)。

提高了系统(逻辑块)的复用性,比如上面的服务A做自己的事情,万一以后有个API仍然需要A逻辑块,那么该API只需要再次调用A服务即可(实际应用当中的例子:用户服务)。

服务化以后,每个服务甚至可以用不同的语言来实现(存在支持跨语言的RPC框架,比如grpc),一个公司大了以后,可能存在语言差异,有的组使用JAVA,有的组用Go,通过服务化的方式,来将两个不同语言的系统互联。

上面简单介绍了普通集群架构和微服务架构,同样的,微服务化也意味着系统调用的复杂化,有可能一次API的调用对应大批量的服务调用,服务方自己又有一堆服务调用,那么针对这种问题,我们来模拟一次复杂的API调用(注册与发现服务已隐藏),如图4所示:

链路追踪(一)-分布式链路追踪系统的介绍

图4

这是模拟了一次微服务架构中比较复杂的系统调用。⚠️注意:图画的有点歪,微服务架构的设计目标是要高度解耦,每个独立的服务最好都有一份自己独立的资源访问,比如服务A只访问A业务相关的数据库和缓存等资源,图中针对这些资源划分做的很糙

那么现在如果这个较复杂的链路调用上的其中一环发生了性能瓶颈,拖慢了整个API的调用,比如图中的“慢”标识,现在我们再来模拟一下这个性能问题的排查过程(过程相当鬼畜):

负责API编写的同学发现API的响应时间总是达不到预期,自己debug发现导致性能问题的原因是服务C,于是找到了服务C的负责人C同学C同学紧接着排查,发现原来是服务D的调用过慢,于是又跑去找D同学D同学收到C同学的反馈,然后去查自己的服务,发现自己调用的服务E响应缓慢,于是D同学又跑去找E同学E同学紧接着排查,发现原来是自己这里调用的Redis_02服务有问题,然后自己排查,如果不是自己调用方式有问题,接下来还可能去联系对应的Redis_02相关维护人员帮助检查瓶颈点。

对比简单集群方式中的单系统性能问题排查,微服务针对此类问题的排查简直是一场噩梦,这其中涉及到的人跟瓶颈节点的深度成正比,因为任何一个环节都有可能存在性能问题,而拖慢整个进度的根源未知,那么有没有一种工具可以完成跨服务跨系统的去跟踪这次的调用链路呢?

1.2:分布式链路追踪

结合上面的问题,分布式链路追踪系统就诞生了,来看下Google的这篇文章:Dapper,大规模分布式系统的跟踪系统,可以对分布式链路追踪系统有个系统的认识。

单纯的理解链路追踪,就是指一次任务的开始到结束,期间调用的所有系统及耗时(时间跨度)都可以完整记录下来,比如上面图4的例子,假设总耗时100ms,存在瓶颈链路C-->D-->E-->Redis02,如果链路追踪系统做好了,链路数据有了,借助前端解析和渲染工具,可以达到下图中的效果:

 链路追踪(一)-分布式链路追踪系统的介绍链路追踪(一)-分布式链路追踪系统的介绍

图5

可以看到从API的调用开始到每个涉及到的系统调用以及系统内部的调用链路和时间跨度被直观的展示出来了,通过上图,可以看到时间跨度最长的就是Redis_02,该服务的调用间接拖慢了E服务、D服务、C服务的响应,最后由C服务直接导致API整体响应缓慢,通过这个图,就可以直接找到对应的责任人去排查对应的问题,而不是像之前那样找一群人。

二、分布式链路追踪系统的组成

类似很多监控系统,该系统也分为基础数据采集+数据存储+前端展示几个部分,来看下一个分布式链路系统的基本结构:

链路追踪(一)-分布式链路追踪系统的介绍

图6

上图比较粗略的展示了一个完整的链路追踪系统的结构,本篇文章不会介绍具体的链路追踪系统的实现,可以先简单将该系统理解为接收+存储链路数据的作用,前端也一样,可以先简单理解为请求链路系统API,API内部负责读取db,并将数据封装成前端需要的格式,前端负责绘制图5中的页面即可(只要数据结构约定好,对于专业的前端工程师做出图5的效果是很容易的,当然网上也有现成的前端工具)。

本篇文章主要介绍链路追踪究竟是什么,可以解决什么问题,下一篇将会详细介绍“链路数据采集SDK”,因为这一部分是跟业务组件开发人员直接挂钩的,下一篇会说明链路追踪的数据结构、如何做到链路数据的采集和上报、如何做到跨服务的链路追踪。

开始前可以先了解一个标准:OpenTracing语义标准

这里面讲了两个很重要的概念:Tracer和Span,一个Tracer认为是一次完整的链路,内部包含n多个Span,Span表示具体的一次调用,图5中就是一次完整的调用链路,里面每个耗时条都是一个Span,Tracer和Span存在一对多的关系(看到这里,图6中的链路追踪API的实现可以认为是根据Tracer的id聚合一批存在父子关系的Span封装成定义好的数据结构传给前端进行渲染的),根据图5,可以知道Span与Span之间又存在父子关系。

具体的实现方案和实现方法,下一篇会详细介绍~下一篇会围绕着图5进行展开。


推荐阅读
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 2017年软件开发领域的七大变革
    随着技术的不断进步,2017年对软件开发人员而言将充满挑战与机遇。本文探讨了开发人员需要适应的七个关键变化,包括人工智能、聊天机器人、容器技术、应用程序版本控制、云测试环境、大众开发者崛起以及系统管理的云迁移。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 本文探讨了使用Python进行微服务架构设计的合理性和适用性。首先,介绍了微服务的基本概念及其在现代软件开发中的重要性。接着,通过具体的业务场景,详细分析了Python在微服务架构设计中的优势和挑战。文章还讨论了在实际应用中可能遇到的问题,并提出了相应的解决方案。希望本文能够为从事Python微服务开发的技术人员提供有价值的参考和指导。 ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文介绍了如何通过命令行有效地终止所有 Node.js 进程实例,以解决因端口冲突或其他服务冲突导致的问题。 ... [详细]
  • 如何在U8系统中连接服务器并获取数据
    本文介绍了如何在U8系统中通过不同的方法连接服务器并获取数据,包括使用MySQL客户端连接实例的方法,如非SSL连接和SSL连接,并提供了详细的步骤和注意事项。 ... [详细]
  • 本文最初发表在Thorben Janssen的Java EE博客上,每周都会分享最新的Java新闻和动态。 ... [详细]
  • Juval Löwy主张,每个类都应被视为服务,这并非是为了让服务无处不在,而是因为微服务是经过深思熟虑后系统分解的自然结果。在他的设计和构建的系统中,这种理念有助于提高模块化、可维护性和扩展性。通过将每个类视为独立的服务,系统能够更好地应对复杂性,实现更灵活的部署和更高的性能。 ... [详细]
  • Spring Cloud 学习指南:初学者入门篇
    Spring Cloud 学习指南:初学者入门篇 ... [详细]
  • 回顾过去十多年的开发经历,我在技术能力、培训机会、国际视野以及大型企业的工作经验方面都有了显著的提升。特别是从最初的月薪8k到如今的38k,这一过程中,我深刻体会到系统化学习对提升架构能力的重要性。最初踏入职场时,面对众多未知,我主要依赖团队领导的指导,专注于编写代码、管理数据库和进行测试。随着经验的积累和技术的不断进步,我逐渐意识到,只有通过系统化的学习和实践,才能在技术领域取得更大的突破。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
author-avatar
小勺年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有