Java生鲜电商平台-SpringCloud分布式请求跟踪系统设计与实践
Java生鲜电商平台微服务现状
- 某个服务挂了,导致上游大量报警,如何快速定位哪个服务出问题?
- 某个核心挂了,导致大量报错,如何快速定位哪里出了问题?
- 应用程序的性能瓶颈?
- 线上发布了服务,怎么知道一切正常?
- App响应延迟,怎么确定有哪些服务导致?
如何解决
- 业务端去解决,通过日志,grep,awk,sed等等定位。
- 分布式请求跟踪系统。(帮助开发人员快速理解系统行为,快速定位问题的工具,分布式请求跟踪系统应运而生)
产品
设计需求
-
基于日志的分布式请求跟踪系统
- 业务侵入小
- 将每个系统分散的日志聚合起来,并进行海量数据日志分析。
-
核心---调用链
- 每次请求生成一个全局唯一id,通过它将不同系统生成的日志串在一起,重组成调用链,使其价值达 1+1》2的效果。
- 开发人员通过分布式请求跟踪链排查问题
- 对多个请求进行统计和分析。
设计目标
- 低侵入性
- 作为非业务组件,尽量减少侵入或者无侵入其他业务系统,对于使用方透明,减少业务开发人员的负担。
- 灵活的应用策略
- 使使用方可以根据需求,自定义收集数据的使用范围和粒度。
- 时效性
- 从数据的产生和收集,到数据的分析与处理,再到最终的页面展现,尽可能快。
- 可视化
- 使用场景友好的用户视角,可读性高。
分布式请求跟踪系统使用的场景
场景一 调用链跟踪
一次请求调用过程的展示,以图形化方式梳理各个为服务端集群之间的调用关系,并记录整个调用过程的耗时,协助开发人员分析整个系统的瓶颈点与热点,从而优化系统。
场景二 调用链的路径分析
对多条调用链进行分析,整理出集群之间的调用关系,计算出整个调用链路的关键节点、直接依赖、间接依赖 强度等等
场景三 调用来源分析
针对某一特定集群,整理出其他集群对其调用情况,防止错误调用情况的发生。
场景四 调用量统计
实时统计各个计算的调用次数、QPS、平均耗时、最大耗时等信息,开发人员可以根据相关信息进行容量规划。
场景五 监控请求调用量
开发人员通过自定义正则表达式,对匹配该规则的URL进行实时监控,包括调用次数等等。。。。。。
整体架构设计
-
埋点和生成日志
-
java探针-javaagent技术,通过本地socket将收集到的数据实时发送给本机上的日志收集节点agent,将本机上的多个java探针的日志数据发送到日志收集服务器集群。
-
-
收集和存储日志
-
日志收集服务器集群对数据进行格式化处理之后,分成三个工作流进行后续处理
-
-
汇总和重组调用链
-
分析和统计调用链
- 原始数据直接存入到ES集群中,用于页面实时调用链的展示
- 原始数据存入到本地的日志中,通过Flume上传到HDFS急群众,利用Hadoop集群定时的进行离线分析,分析后的结果存入到ES集群中,用于页面数据分析的展示。
-
原始数据发送到Spark/Flink在线分析集群,进行QPS、平均耗时等实时数据统计,分别将计算结果保存到Redis集群和ES集群中,用于页面实时数据统计的展示。
整体架构
埋点和生成日志
- 请求唯一标识(TraceID)
- 时序标识(SequenceID)
- 深度标识(DepthID)
重点是ID的生成,怎么生成呢?
ID体系设计
-
请求唯一标识(TraceID)网关生成
分布式id -
时序标识(SequenceID)
每层从1开始递增,放在threadlocal里面。下一层继承上一层的深度,加一个点。 -
深度标识(DepthID)
点的个数递增
开源产品选择
- Pinpoint
-
Apache SkyWalking