应用现代化

Wavefront 中的分布式追踪技术 (Distributed Tracing)

随着软件技术的发展,越来越多的开发团队转向了微服务架构,跟传统的单体 (Monolith) 应用相比,微服务架构具有多重优势:

  • 更快:通过把应用功能分散到多个离散的微服务中去,更加适应现代的敏捷开发方式,能够更快地交付新功能,任何修改都不再需要测试整个的软件。
  • 更有弹性:微服务架构更容易扩展,当工作负载增加时,我们可以很方便地生成更多的服务实例来提升处理能力。
  • 更具有灵活性:微服务架构更容易修改,不会因为单个服务中的错误而波及其他的功能。

但是微服务架构也带来一些新的问题,原来单体应用的内部代码变成了数量众多的外部服务调用,想要理清楚这些复杂的外部调用关系成为一个新的挑战。在单体应用内部追踪 (trace) 一个服务请求 X 是比较简单的,但是微服务架构下,同样的服务 X 可能运行在不同服务器的多个进程中,甚至位于不同的数据中心,追踪每一个微服务的执行过程变得非常困难。在这种情况下分布式追踪 (Distributed Tracing) 技术应运而生,它的目标是从众多的分布式服务中收集各种指标 (metrics),以供开发人员、SRE (Site Reliability Engineer)、DevOps 小组排除故障、优化应用性能。

Wavefront 支持分布式追踪技术,追踪是指记录并展示应用执行过程的能力,Wavefront 中的分布式追踪技术能够以图形化的方式来展示各个微服务之间的调用关系以及详细的运行参数,从而帮助使用者快速发现问题、定位失败原因、找到性能提升的瓶颈所在。下面是一个衬衫订购应用 BeachShirts 的架构示意图,其中:

  • Amazon RDS 是 AWS 的关系数据库服务,用于记录订单信息;
  • S3 是 AWS 上的对象存储服务,存放衬衫的照片数据;
  • DropwizardGRPC 都是一种 Jave 编程框架,用于实现订单应用的一些功能。

 

在这个例子中,有用户反馈定单流程响应缓慢,这时候就可以利用分布式追踪技术来对应用进行一番追踪分析。下图就是追踪结果图形化展示的一个例子:

  • Trace 展示了服务请求是如何通过多个微服务之间的调用来实现的,它展现为一个树状结构;
  • Span 代表了某一个服务或功能调用 (例如一个 HTTP 服务请求或一个 RPC 过程调用),Trace 树就是由多个 Span 构成的;
  • 橙色的粗线条代表了该服务请求执行的关键路径,图中代表 WrappingService.giftWrapping 的那一段 Span 是最长的,有可能就是性能瓶颈所在。

跟传统的单体应用相比,微服务架构应用运行在多个数据中心的多台服务器上,每个微服务会被调用很多次,并且这些服务之间的调用是并发或者异步的,这些都给微服务架构应用的追踪带来了挑战:

  • 缺少端到端的可见性:微服务架构应用提供的服务本身就是并发的,每个服务又是由一系列微服务的调用来实现的,这些微服务分布在不同的服务器和操作系统进程中,要想了解整个的服务调用脉络是很困难的。
  • 难于发现性能瓶颈:应用的整体响应速度取决于一系列微服务的性能,在众多的微服务中找到性能瓶颈是一项挑战性的工作。
  • 追踪方法的复杂性:追踪技术需要对应用代码进行插装 (instrumenting),把追踪代码交织在应用代码中,微服务架构需要把追踪代码插装到每一个微服务中去,手工完成的话工作量巨大。

不过不用担心,Wavefront 已经解决了分布式追踪问题,微服务架构应用只需要使用 Wavefront SDK 和很少的代码修改,就能够利用 Wavefront 来收集各种运行指标和分布式追踪的数据,其工作原理如下图示,Wavefront 可以直接收集数据,也可以通过 Proxy 代理来收集数据。关于分布式追踪已经存在了一个业界标准 OpenTacing,Wavefront 也是附合这个标准的,所以它也可以兼容一些第三方的追踪工具如 Jaeger、AWS X-ray 等,从它们插装的代码中采集追踪数据。

代码插装 (Instrumenting) 是一种用于监视应用性能、诊断应用错误的技术,它是通过工具在应用中插入代码,然后通过这些插入的代码来输出日志等信息来记录或追踪应用的运行过程。Wavefront 通过插装在各个微服务中的代码来收集和追踪这些微服务运行过程中的各种指标,进而通过对收集到的指标进行分析来定位问题或性能瓶颈。

 

 

最后给大家看一个 Wavefront 的演示视频 (提示:请选择视频下方的“高清 720P”选项来观看),让大家对分布式追踪功能有一个直观的认识。演示场景就是前面所举的 BeachShirts 应用,我们发现该应用响应比较慢,所以利用 Wavefront 的分布式追踪技术收集了组成应用的各个微服务的指标,通过对这些指标的分析来一步步找到应用瓶颈所在。

 

解释一下演示中的一些概念:

  • JerseyJersey 是一个用于开发 RESTful Web Service 的 Java 软件框架。
  • Duration P95: P95 是指收集到的服务执行时长 Duration 值中只取 95% 以下的那些值,即去掉 5% 的最大值,这样可以去掉一些极端的情况 (例如由于网络拥堵而造成的延迟),比较客观地反映应用执行情况。