“微服务的战争” 是一个关于微服务设计思考的系列题材,主要是针对在微服务化后所出现的一些矛盾/冲突点,不涉及具体某一个知识点深入。如果你有任何问题或建议,欢迎随时交流。

背景

在经历微服务的战争:级联故障和雪崩 的 P0 级别事件后,你小手一摊便葛优躺了。开始进行自我复盘,想起这次排查经历,由于现在什么基础设施都还没有,因此在接收到客户反馈后,你是通过错误日志进行问题检查的。

但在级联错误中,错误日志产生的实在是太多了,不同的服务不同的链路几乎都挤在一起,修复时间都主要用在了翻日志上,翻了好几页才找到了相对有效的错误信息。

如果下一次再出现类似的问题,可不得了,MTTR 太久了,4 个 9 很快就会用完。这时候你想到了业界里经常被提起的一个利器,那就是 “分布式链路追踪系统”。粗略来讲,能够看到各种应用的调用依赖:

其中最著名的是 Google Dapper 论文所介绍的 Dapper。源于 Google 为了解决可能由不同团队,不同语言,不同模块,部署在不同服务器,不同数据中心的所带来的软件复杂性(很难去分析,无法做定位),构建了一个的分布式跟踪系统:

自此就开启了业界在分布式链路的启发/启蒙之路,很多现在出名的分布式链路追踪系统都是基于 Google Dapper 论文发展而来,基本原理和架构都大同小异。若对此有兴趣的可具体查看 Google Dapper,非常有意思。

(Google Dapper 中存在跟踪树和 Span 的概念)

选型?有哪些

想做链路追踪,那必然要挑选一款开源产品作为你的分布式链路追踪系统,不大可能再造一个全新的,先实现业务目的最重要。因此在网上一搜,发现如下大量产品:

  • Twitter:Zipkin。
  • Uber:Jaeger。
  • Elastic Stack:Elastic APM。
  • Apache:SkyWalking(国内开源爱好者吴晟开源)。
  • Naver:Pinpoint(韩国公司开发)。
  • 阿里:鹰眼。
  • 大众点评:Cat。
  • 京东:Hydra。

随手一搜就发现这类产品特别的多,并且据闻各大公司都有自己的一套内部链路追踪系统,这下你可犯了大难。他们之间都是基于 Google Dapper 演进出来的,那本质上到底有什么区别,怎么延伸出这么多的新产品?

Jaeger

首先看看由 Uber 开发的 Jaeger,Jaeger 目前由 Cloud Native Computing Foundation(CNCF)托管,是 CNCF 的第七个顶级项目(于 2019 年 10 月毕业):

  • Jaeger Client:Jaeger 客户端,是 Jaeger 针对 OpenTracing API 的特定语言实现,可用于手动或通过与 OpenTracing 集成的各种现有开源框架(例如Flask,Dropwizard,gRPC等)来检测应用程序以进行分布式跟踪。
  • Jaeger Agent:Jaeger 客户端代理,在 UDP 端口上监听所接受的跨度并将其分批发送给 Collector。
  • Jaeger Collector:Jaeger 收集器,顾名思义是面向 Agent,用于收集/管理链路的追踪信息。
  • Jaeger Query:数据查询与前端界面展示。
  • Jaeger Ingester:可从 Kafka 读取数据并写入其他的存储介质(Cassandra,Elasticsearch)。

在了解 Jaeger 的各组件功能后,主要关注其整体的整体架构上的数据流转:

Jaeger 是一个很经典的架构,由客户端主动发送链路信息到 Agent,Agent 上报给 Collector,再经由队列,最终落地到存储。再由另外的可视化管理后台进行查看和分析。

更具现化就是 上报 =》收集 =》存储 =》分析的标准化流程。并且你会发现 Jaeger 与 Zipkin 在架构上差不多:

  • Zipkin Collector:Zipkin 收集器,用于收集/管理链路的追踪信息。
  • Storage:Zipkin 数据存储,支持 Cassandra、ElasticSearch 和 MySQL 等第三方存储。
  • Zipkin Query Service:数据存储并建立索引后,用于查找和检索跟踪信息。
  • Web UI:数据查询与前端界面展示。

从时间上来看 Jaeger 比 Zipkin 晚四年,莫非是重复造轮子。经过翻阅,可得知做 Jaeger 的主要原因是:

当时将跨度发送到 Zipkin 的唯一方法是通过 Scribe,而 Zipkin 支持的唯一高性能数据存储是 Cassandra。当时 Uber 对这两种技术都没有经验,因此选择了自己构建一个后端,该后端将一些自定义组件与 Zipkin UI 结合在一起,形成了一个完整的跟踪系统。

更详细可阅读 Evolving Distributed Tracing at Uber Engineering,可以了解很多细节。

阿里鹰眼

链路追踪系统的另一代表,基于日志和流式计算去做的居多,像是阿里的鹰眼,滴滴的 traces,如下图:

更具体可见《阿里巴巴鹰眼技术解密》 和 《异构系统链路追踪——滴滴 trace 实践》 在大会上的分享,这里就不再赘述了,推荐好奇或忧愁链路追踪落地的小伙伴们阅读。

总结

大多数在初始选型时都会选择亲和性比较强的追踪系统,就像是 Jaeger 属于 Go,Zipkin、Skywalking 是 Java 系居多,三者都完全兼容 OpenTracing,只是架构上多少有些不同,且都是基于 Google Dapper 发散,因此所支持的基本功能和查询页面优雅与否很重要。

而本来就有原始的 N 个系统,如果想接入直接新的链路追踪系统,还是非常麻烦的。因为原意想接入,必然是想解决原有系统的排查/定位问题,而不单单是为了新系统,因此单从接入的角度来讲,大多不会就不会使用既有开源追踪系统(除非历史债务不大),且数据量可能极大。

因此基于既有方法去改造来清洗数据再做成链路追踪的模式也挺常见的,这之中日志常常是一个比较好的下手点,也就是去清洗某某数据,形成新的分析系统,再造一个内部轮子。

另外近两年基于 ServiceMesh 的 ”无” 侵入式链路追踪也广受欢迎,似乎是一个被看好的方向,其代表作之一 Istio 便是使用 CNCF 出身的 Jaeger,且 Jaeger 还兼容 Zipkin,在这点上 Jaeger 完胜。

作者:陈煎鱼

链接:https://developer.51cto.com/art/202009/625916.htm

微服务链路追踪_微服务的战争:选型?分布式链路追踪相关推荐

  1. go 链路追踪_【go-micro实践】jaeger分布式链路追踪

    安装jaeger jaeger提供一个all in one 的docker镜像,可以快速搭建实验环境 docker run -d --name jaeger -e COLLECTOR_ZIPKIN_H ...

  2. golang微服务框架对比_微服务里程碑,Golang与Spring Cloud Alibaba完美结合

    目前微服务架构仍是软件架构中最新的热门话题,虽然Golang是一门新的语言,但Golang的性能比python和java高出不少.既能承受程序使用运行的服务构建的繁重负载,又容易与GitHub集成,管 ...

  3. 微服务启动顺序_微服务框架Demo.MicroServer运行手册

    一.背景说明: 之前分享过一个微服务开发框架, "享一个集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionle ...

  4. java微服务项目简历_微服务框架-SpringCloud简介

    前面一篇文章谈到微服务基础框架,而Netflix的多个开源组件一起正好可以提供完整的分布式微服务基础架构环境,而对于Spring Cloud正是对Netflix的多个开源组件进一步的封装而成,同时又实 ...

  5. 微服务可靠性测试_微服务可靠性设计

    1.背景 微服务化之后,系统分布式部署,传统单个流程的本地API调用被拆分成多个微服务之间的跨网络调用,由于引入了网络通信.序列化和反序列化等操作,系统发生故障的概率提高了很多.微服务故障,有些是由于 ...

  6. 微服务认证模式_微服务之“网关模式”

    定义 API网关是一个服务器,它是系统中的单个入口点,用户对API网关进行单一呼叫,然后API网关调用每个相关的微服务器.它类似于面向对象设计的Facade模式.API网关封装内部系统架构,并提供针对 ...

  7. 微服务升级优点_微服务–——定义, 原则 和 优点

    微服务是业界最新的流行语,似乎每个人都在以这样或那样的方式谈论它.让我们理解一下什么是微服务?通过这篇教程我们将理解微服务的定义,概念以及微服务的原理. 微服务的定义 如今,微服务是SOA(面向服务的 ...

  8. 合沟微服务怎么添加_微服务架构:动态配置中心搭建

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在微服务架构中,服务之间有着错综复杂的依赖关系,每个服务都有自己的依赖配置,在运行期间很多配置会根据访问流量等因素进行调整,传统的配置信息 ...

  9. java微服务是什么_微服务架构:什么是微服务

    博主 本文为微服务连载第一篇,如果有幸看到,还请找个时间仔细阅读,欢迎收藏或转载,如有不足之处烦请留言指正,共同进步,希望对你有帮助,谢谢 引言 和朋友聊天,招聘,看个行业要闻都是微服务... 最近几 ...

  10. (十二)java版b2b2c社交电商spring cloud分布式微服务:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪...

    Spring Cloud Sleuth Spring cloud b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.一般的,一个分布式服务跟踪系统,主要有三部分:数据收集.数据存储和数 ...

最新文章

  1. loadrunner录制0事件_LoadRunner脚本异常捕获处理
  2. 工作中常用到的sql命令!!!
  3. TypeScript里的类型合并操作符
  4. ros创建工作空间_ROS入门学习之七Moveit机械臂控制
  5. 【LeetCode笔记】85. 最大矩形(Java、单调栈)
  6. 【2015年第4期】基于大数据技术的P2P网贷平台风险预警模型
  7. 云小课|RDS实例连接又失败?看我祭出杀手锏!
  8. java 管道流的读写操作 用于两个线程之间的通信
  9. java成员访问属性,在Java中,针对类、成员方法和属性提供了四种访问级别,分别是private、static、prot...
  10. 据报道称“浏览器内核有上千万行代码”,浏览器内核真的很复杂吗?
  11. MapReduce案例
  12. 别和 Python 说再见了!丨搞不定它的程序员,到底怎么了?
  13. react-native-echarts 解决数据刷新闪烁,不能动态连续绘制问题(转载)
  14. ×××购回“四不像”笔记本
  15. 基于ssm java jsp的酒店管理系统 前后台
  16. OLED原理、时序和操作+自己源码程序
  17. steam换头像出现服务器错误_推特热搜第二!史上bug最多的游戏终于出现…
  18. Dwz 国产框架 JUI 分页组件下拉菜单bug解决方案
  19. linux远程管理工具:putty
  20. 设置开机自动启动chrome浏览器

热门文章

  1. 【图像去噪】基于matlab分裂Bregman算法图像去噪【含Matlab源码 1644期】
  2. 【配送路径规划】基于matlab遗传算法求解带时间窗的多配送中心半开放式车辆路径规划问题【含Matlab源码 YC002期】
  3. 【E-DEEC】基于matlab增强的分布式能源有效集群(E-DEEC)【含Matlab源码 1566期】
  4. 【优化求解】基于matlab生物地理算法求解MLP问题【含Matlab源码 1415期】
  5. 【优化覆盖】基于matlab萤火虫算法求解无线网络传感覆盖优化问题【含Matlab源码 1275期】
  6. mysql连接池满了_《MySql体系结构与存储引擎》面试腾讯前总结
  7. python3自动化软件发布系统_PythonPC客户端自动化实现原理(pywinauto)
  8. nosql第一章课后习题
  9. mysql 修改字段为主键自增_「MySQL整理」 MySQL语法,如何操作数据表
  10. python中wordcloud函数不同形状云图_10行Python代码生成任意形状的文字云图