💡
原文中文,约21500字,阅读约需52分钟。
📝
内容提要
本文介绍了分布式追踪系统中常用的ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal和TransmissibleThreadLocal等类的特点及其在解决跨线程传递上下文信息方面的作用。同时,分析了MTrace跨线程传递方案的实现方式和存在的问题,并提出了使用自定义的线程池来解决@Async场景下“弄丢”TraceId的问题的方法。此外,还介绍了Zipkin、SkyWalking和EagleEye等分布式追踪系统的基本框架和跨线程解决方案。其中,Zipkin使用ThreadLocal和InheritableThreadLocal来解决父子线程trace信息传递丢失的问题,而SkyWalking则使用ThreadLocal来存储上下文信息,并通过包装方式避免大的代码改动。EagleEye则提供了多维度、实时、自动化的应用性能监控和分析能力。
🎯
关键要点
- 本文介绍了分布式追踪系统中常用的ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal和TransmissibleThreadLocal等类的特点。
- 分析了MTrace跨线程传递方案的实现方式和存在的问题。
- 提出了使用自定义的线程池来解决@Async场景下“弄丢”TraceId的问题的方法。
- 介绍了Zipkin、SkyWalking和EagleEye等分布式追踪系统的基本框架和跨线程解决方案。
- Zipkin使用ThreadLocal和InheritableThreadLocal来解决父子线程trace信息传递丢失的问题。
- SkyWalking使用ThreadLocal来存储上下文信息,并通过包装方式避免大的代码改动。
- EagleEye提供了多维度、实时、自动化的应用性能监控和分析能力。
- MTrace是美团参考Google Dapper设计的分布式链路追踪系统,旨在帮助开发人员分析系统性能和快速排查告警问题。
- @Async注解用于标记异步执行的方法,需在配置类上增加@EnableAsync注解。
- MTrace支持跨线程传递和代理来优化埋点方式,减轻开发人员的使用成本。
- InheritableThreadLocal允许子线程访问父线程中的变量,而TransmittableThreadLocal和TransmissibleThreadLocal则提供了更灵活的跨线程传递方案。
- MTrace的跨线程传递方案通过在子线程初始化Runnable对象时传递父线程的trace信息来避免丢失。
- 解决@Async场景下TraceId丢失的问题可以通过自定义线程池来实现。
- Zipkin、SkyWalking和EagleEye等分布式追踪系统各有其优缺点,主要基于Google Dapper的设计思想。
- EagleEye采用javaagent的方式修改线程池实现,确保子线程可以获取到父线程的trace信息。
🏷️
标签
➡️