24分布式trace(排查追踪问题)

130 阅读2分钟

1.慢请求如何排查

1.1在一体化架构中的慢请求排查如何做

实现方式:打印下每个下单操作的耗时情况,通过耗时情况找到延迟最高的一步

出现问题1:耗时日志是不连续的,无法定位同一个请求的所有日志

解决办法:为每一个请求增加一个request ID(简单实现放在thread loacl中即可)(也可以存放上下文)

出现问题2:针对每次慢请求都需要人为操作,不够抽象

解决办法:通过切面编程进行日志打印

Java中的AOP

  • 静态代理(更适合日志的打印)
    • AspectJ 编译期做切面代码注入
    • 增加编译时间,对运行期性能没有影响
  • 动态代理
    • Spring AOP 运行期做切面代码注入
    • 运行期生成代理对象,运行期性能稍差

出现问题3:日志量过大,怎么减少日志量

解决办法:可以针对请求取样,对request id进行取余

出现的问题4:日志分布在不同机器上,导致需要每台机器查看

解决办法:将日志发送到消息队列中,在由消息队列集中存储(Elasticsearch)(公司的baimai系统)

image.png

  1. 生成requestid,将多次请求日志串起来
  2. 使用切面管理日志,避免对业务代码侵入
  3. 增加日志采样率,避免全量日志的打印
  4. 将日志统一集中存储

2.分布式Trace

相比于单体化架构的清晰程度,需要在分布式架构下通过trace+spanid将上下游关系表示出来

image.png

每次传递前,获取当前的traceid和spanid,并计算出新的traceid+spanid后传输

如果是顺序传输(需用引入新的计算方法,不过页更方便梳理上下游关系)

公司采用的每次将接收spanid作为父id,同时生成新的spanid进行传输

3.课程小结

  • 服务追踪要求
    • 对代码无侵入
    • 性能
  • 单体架构还是服务化架构
    • 保证requestid,保证上下游有span id