zoukankan      html  css  js  c++  java
  • Java生鲜电商平台-SpringCloud分布式请求跟踪系统设计与实践

    Java生鲜电商平台-SpringCloud分布式请求跟踪系统设计与实践

    Java生鲜电商平台微服务现状

    • 某个服务挂了,导致上游大量报警,如何快速定位哪个服务出问题?
    • 某个核心挂了,导致大量报错,如何快速定位哪里出了问题?
    • 应用程序的性能瓶颈?
    • 线上发布了服务,怎么知道一切正常?
    • App响应延迟,怎么确定有哪些服务导致?
     
     

    如何解决

    1. 业务端去解决,通过日志,grep,awk,sed等等定位。
    2. 分布式请求跟踪系统。(帮助开发人员快速理解系统行为,快速定位问题的工具,分布式请求跟踪系统应运而生)

    产品

     
     

    设计需求

    • 基于日志的分布式请求跟踪系统

      • 业务侵入小
      • 将每个系统分散的日志聚合起来,并进行海量数据日志分析。
    • 核心---调用链

      • 每次请求生成一个全局唯一id,通过它将不同系统生成的日志串在一起,重组成调用链,使其价值达 1+1》2的效果。
      • 开发人员通过分布式请求跟踪链排查问题
      • 对多个请求进行统计和分析。

    设计目标

    • 低侵入性
      • 作为非业务组件,尽量减少侵入或者无侵入其他业务系统,对于使用方透明,减少业务开发人员的负担。
    • 灵活的应用策略
      • 使使用方可以根据需求,自定义收集数据的使用范围和粒度。
    • 时效性
      • 从数据的产生和收集,到数据的分析与处理,再到最终的页面展现,尽可能快。
    • 可视化
      • 使用场景友好的用户视角,可读性高。

    分布式请求跟踪系统使用的场景

    场景一 调用链跟踪

    一次请求调用过程的展示,以图形化方式梳理各个为服务端集群之间的调用关系,并记录整个调用过程的耗时,协助开发人员分析整个系统的瓶颈点与热点,从而优化系统。

    一次调用的耗时
     
     
    多次调用
     
     
    访问量与耗时情况
     
     

    场景二 调用链的路径分析

    对多条调用链进行分析,整理出集群之间的调用关系,计算出整个调用链路的关键节点、直接依赖、间接依赖 强度等等

     
     

    场景三 调用来源分析

    针对某一特定集群,整理出其他集群对其调用情况,防止错误调用情况的发生。

     
    image

    场景四 调用量统计

    实时统计各个计算的调用次数、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 

  • 相关阅读:
    菜单、toast、对话框的使用
    对话框应用反射销毁
    java随机汉字生成
    Android从主界面退出
    Android获取网络状态
    ssh secure shell 乱码问题
    MongDB安装使用
    安装scrapy
    列表查找以及二分查找
    Tuple、list的区别以及dict和set
  • 原文地址:https://www.cnblogs.com/jurendage/p/11751529.html
Copyright © 2011-2022 走看看