全链路设计与实践

背景

随着公司业务的高速发展,公司服务之间的调用关系愈加复杂,如何理清并跟踪它们之间的调用关系就显的比较关键。线上每一个请求会经过多个业务系统,并产生对各种缓存或者 DB 的访问,但是这些分散的数据对于问题排查,或者流程优化提供的帮助有限。在这样复杂的业务场景下,业务流会经过很多个微服务的处理和传递,我们难免会遇到这些问题:

  • 一次请求的流量从哪个服务而来? 最终落到了哪个服务中去?
  • 为什么这个请求这么慢? 到底哪个环节出了问题?
  • 这个操作需要依赖哪些东西? 是数据库还是消息队列? Redis挂了,哪些业务受影响?

设计目标

  • 低消耗性:跟踪系统对业务系统的影响应该做到足够小。在一些高度优化过的服务,即使一点点损耗也容易察觉到,而且有可能迫使在线负责的部署团队不得不将跟踪系统关停
  • 低侵入性:作为非业务组件,应当尽可能少侵入或者无侵入业务系统,对于使用方透明,减少开发人员的负担
  • 时效性:从数据的收集产生,到数据计算处理,再到最终展现,都要求尽可能快
  • 决策支持:这些数据是否能在决策支持层面发挥作用,特别是从 DevOps 的角度
  • 数据可视化:做到不用看日志通过可视化进行筛选

实现功能

  • 故障定位:调用链路跟踪,一次请求的逻辑轨迹可以完整清晰的展示出来。
  • 性能分析:调用链的各个环节分别添加调用耗时,可以分析出系统的性能瓶颈,并针对性的优化。
  • 数据分析:调用链是一条完整的业务日志,可以得到请求的行为路径,汇总分析应用在很多业务场景

设计思路

对于上面那些问题,业内已经有了一些具体实践和解决方案。通过调用链的方式,把一次请求调用过程完整的串联起来,这样就实现了对请求链路的监控。

在业界,目前已知的分布式跟踪系统,比如「Twitter Zipkin 与淘宝鹰眼」,设计思想都是来自 Google Dapper 的论文 「Dapper, a Large-Scale Distributed Systems Tracing Infrastructure」

典型分布式调用过程

图1:这个路径由用户的X请求发起,穿过一个简单的服务系统。用字母标识的节点代表分布式系统中的不同处理过程。

分布式服务的跟踪系统需要记录在一次特定的请求后系统中完成的所有工作的信息。举个例子,图1展现的是一个和5台服务器相关的一个服务,包括:前端(A),两个中间层(B和C),以及两个后端(D和E)。当一个用户(这个用例的发起人)发起一个请求时,首先到达前端,然后发送两个 RPC 到服务器 B 和 C 。B 会马上做出反应,但是 C 需要和后端的 D 和 E 交互之后再返还给 A ,由 A 来响应最初的请求。对于这样一个请求,简单实用的全链路跟踪的实现,就是为服务器上每一次你发送和接收动作来收集与跟踪

调用链路关系图

cs - CLIENT_SEND,客户端发起请求
sr - SERVER_RECIEVE,服务端收到请求
ss - SERVER_SEND,服务端处理完成,发送结果给客户端
cr - CLIENT_RECIEVE,客户端收到响应

技术选型

公司 选项 是否开源 优缺点
淘宝 EagleEye 主要基于内部 HSF 实现,HSF 没有开源,故鹰眼也没有开源
Twitter Zipkin 基于 Http 实现,支持语言较多,比较适合我们公司业务
点评 CAT 自定义改造难度大,代码比较复杂,侵入代码,需要埋点
京东 Hydra 主要基于 Dubbo 实现,不适合公司 Http 请求为主的场景

综上,考虑到公司目前以 Http 请求为主的场景,最终决定采用参考 Zipkin 的实现思路,同时以 OpenTracing 标准来兼容多语言客户端

系统设计

整体架构图及说明

一般全链路跟踪系统主要有四个部分:数据埋点、数据传输、数据存储、查询界面

数据埋点

  • 通过集成 SDK 到沪江统一开发框架中,进行低侵入性的数据收集
  • 采用 AOP 切面方式,将收集的数据存储在本地线程变量 ThreadLocal 中,对应用透明
  • 数据记录 TraceId、事件应用、接口、开始时间、耗时
  • 数据采用异步线程队列的方式发送到 Kafka 队列中,减少对业务的影响

目前支持的中间件有:

  • Http 中间件
  • Mysql 中间件
  • RabbitMQ 中间件

数据传输

我们在 SDK 与后端服务之间加了一层 Kafka ,这样做既可以实现工程解耦,又可以实现数据的延迟消费,起到削峰填谷的作用。我们不希望因为瞬时 QPS 过高而导致数据丢失,当然为此也付出了一些实效性上的代价。

Kafka Manager 展示

数据存储

数据存储采用 ElasticSearch ,主要存储 Span 与 Annotation 相关的数据,考虑到数据量的规模,先期只保存最近 1 个月的数据。

ELasticSearch Head 数据

查询界面

通过可视化 Web 界面来查询分布式调用链路,同时还提供根据项目维度分析依赖聚合

查询页面

Trace 树

依赖分析

遇到的一些坑

Web 页面加载超时

问题

使用 Zipkin 官网 UI 的时候,会偶发性的出现业务加载超时。

解决方案

原因是 Zipkin 加载页面的时候会一次性加载该项目里面所有的 Span ,当项目使用 Restful 形式的 API 时,就会产生几百万的 Span。最后,我们重写 UI 页面采用懒加载的方式,默认展示最近 10 条 Span,同时支持输入字符来动态查询 Span 的功能。

Span 堆积过多

问题

当使用页面查询 Trace 的时候,发现某个链路堆积到上千条 Span

解决方案

排查下来,业务方使用 HttpClient 中间件发送 Http 请求超时的时候,SDK 并未拦截超时对应的异常,导致事件一直在存储在线程对应的 ThreadLocal 中

总结

全链路跟踪系统关键点:调用链。

每次请求都生成全局唯一的 TraceID,通过该 ID 将不同的系统串联起来。实现调用链跟踪,路径分析,帮助业务人员快速定位性能瓶颈,排查故障原因。

参考资料

原文地址:http://blog.51cto.com/13527416/2067846

时间: 2024-11-06 07:34:59

全链路设计与实践的相关文章

微服务架构—自动化测试全链路设计

背景 被忽视的软件工程环节 - DEVTESTOPS 微服务架构下测试复杂度和效率问题 开发阶段 unitTest mock 外部依赖 连调阶段 mock 外部依赖 自动化测试阶段 mock 需求 autoTest Mock Gateway 浮出水面 轻量级版本实现 整体逻辑架构 将 mock parameter 纳入服务框架标准 request contract 使用 AOP + RestEasy HttpClientRequest SPI 初步实现 Mock 总结 背景 从 SOA 架构到现

基于Jenkins的持续交付全流程设计与实践

1 从理论开始 什么是DevOps? 近年来,随着DevOps理念的逐渐深入人心,企业逐渐意识到从看似重复的手工劳动中实现自动化流程处理,对于提高企业劳动生产力已经非常重要,尤其是面向互联网的开发者,往往每次上线时,最大的挑战并非需求的走查或测试和改bug,而是由于发布的流程不够规范,将成果发布到目标环境后可能造成的配置错误或引发其他已知未知问题所造成的额外工作量,使得生产环境的发布流程总会存在不顺利. 而DevOps则致力于统一整合软件开发和软件运维,其特点是强烈倡导对构建软件的所有环节(从集

来自滴滴、微博、唯品会、魅族、点评关于全链路压测等问题实践分享

架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第二期:因为大家对全链路压测的问题比较感兴趣,因此做了一番探讨. 参与嘉宾:滴滴技术负责人彭令鹏.魅族系统架构师何伟.唯品会应用架构负责人张广平.新浪微博技术专家聂永.大众点评交易平台技术负责人陈一方.七牛云首席架构师李道兵. 本文是对此次交流的整理,欢迎探讨. 第一轮:自由交流 滴滴彭令鹏:大家好,我是彭令鹏,目前在滴滴平台部负责整个专快车业务的稳定性和效率,之前在百度做了5年半的网页搜索部底层架构的工作.现在在滴滴主要在推四

全链路压测自动化实践

背景与意义 境内度假是一个低频.与节假日典型相关的业务,流量在节假日较平日会上涨五到十几倍,会给生产系统带来非常大的风险.因此,在2018年春节前,我们把整个境内度假业务接入了全链路压测,来系统性地评估容量和发现隐患,最终确保了春节期间系统的稳定. 在整个过程中,我们意识到,全链路压测在整个系统稳定性建设中占有核心重要的位置,也是最有效的方案.结合实际业务节假日的频率(基本平均一个月一次),如果能够把它作为稳定性保障的常规手段,我们的系统质量也能够得到很好的保障.同时,为了解决周期常态化压测过程

全链路压测第一次实践

每年双十一,对买家来说是一场买买买的剁手之旅,但对于电商公司的技术人员来说,却是一次严峻的技术期末考.如何保证系统在预估的流量洪峰来临时,既能保证用户的买买买不受影响, 促进业务及营销活动的目标达成,又能用尽可能少的成本投入保障系统的稳定可用性,是技术童鞋必须面对的挑战.我司在双十一来临的最后关口完成了整个核心链路的全链路压测, 大幅提高了核心链路的服务性能,并发布了最终优化版本.在双十一期间,也取得了一定的成果,期间包括技术.运营.产品.行政等各部门都为之付出了很多努力. 下面的内容,是从启动

魅族大数据之流平台设计部署实践--转

原文地址:http://mp.weixin.qq.com/s/-RZB0gCj0gCRUq09EMx1fA 沈辉煌   魅族数据架构师  2010年加入魅族,负责大数据.云服务相关设计与研发: 专注于分布式服务.分布式存储.海量数据下rdb与nosql融合等技术. 主要技术点:推荐算法.文本处理.ranking算法 本篇文章内容来自第八期魅族开放日魅族数据架构师沈辉煌的现场分享,由IT大咖说提供现场速录,由msup整理编辑. 导读:魅族大数据的流平台系统拥有自设计的采集SDK,自设计支持多种数据

阿里10年分布式技术沉淀:阿里高可用体系核心缔造者、全链路压测创始人告诉你!

原文链接 7月27日,云栖社区.阿里中间件将举办首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术干货.目前活动官网已上线:https://yq.aliyun.com/promotion/262, 点击报名. 本次活动看点十足,大咖齐聚.纯正干货,下面给大家做下详解介绍,相信看后定会让你动心! 议题详情 双11核武器全链路压测--张军 / 阿里巴巴中间件高级技术专家 阿里巴巴双11备战期间,保障系统稳定性最大的难题在于容量规划,而容量规划最大的难题在于准确评估从用户登录到完成购买的整个链条中,

饿了么全链路压测平台的实现与原理

背景 在上篇文章中,我们曾介绍过饿了么的全链路压测的探索与实践,重点是业务模型的梳理与数据模型的构建,在形成脚本之后需要人工触发执行并分析数据和排查问题,整个过程实践下来主要还存在以下问题: 测试成本较高,几乎每个环节都需要人力支撑,费时费力. 由于测试用例较多,涉及的测试机范围较广,手工执行容易犯错,线上测试尤其危险. 记录结果和测试报告极不方便,需要二次加工.填写和上传. 测试过程中靠手工监控,覆盖不全且定位问题困难. 基于这些因素,我们决定推进全链路压测的自动化进程.这篇我们主要介绍全链路

敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)

邀请函:尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧.时间:2014.06.07(周六),上午9:00-12:00,下午14:00-17:30(时长6.5小时)地点:郑州市畜牧路16号牧业经济学院实验楼B座2518(可乘坐B11.909.962.47路等公交车到老长途汽车北站下车畜牧路向东300米路北)软件知识原创基地www.umlonline.or