-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【用户反馈收集】说一下您的使用场景、使用项目、公司,感谢! #73
Comments
|
我想问下能不能只改造InheritableThreadLocal就能解决这个传值的问题,我现在在Spring Cloud Zuul中使用的是InheritableThreadLocal。然后就发现线程复用的时候会出问题,如果按照目前的实现方式,我估计要对zuul中的线程进行处理,这样太麻烦了 |
@yinjihuan 你看下本项目首页介绍
你的应用场景只需要将 |
|
在生产环境全链路压测项目中,用于解决压测标的线程间传递问题。 理论上TransmittableThreadLocal 的原理为在线程启动时利用Map<Transmittable, Object>的数据结构从上一个“父”线程copy引用进入”子”线程进行工作,并在“子”线程结束工作使把其TransmittableThreadLocal里面的值还原为初始状态。(一般在使用线程池,并且使用完毕后如果threadlocal不去显式得remove时还原功能有作用),同时我们注意到 TransmittableThreadLocal 复制的是 引用 ! 但是根据性能压测的场景判断,即父线程在一旦结束时,其压测标记需要显式remove的情况下,子线程的压测标记不可被改变,所以压测场景中,技术上可能是要进行值复制。 为此我们在不覆盖TransmittableThreadLocal的任何方法的情况下,在TransmittableThreadLocal直接放入一个简单的 string天生只能值传递 解决该问题。(另外,在APM工具中 因为span id的递增,这时候需要放入一个对象进行引用传递) 在用户不覆盖java.util.concurrent.ThreadPoolExecutor,java.util.concurrent.ScheduledThreadPoolExecutor 等基本类的情况下(事实上业务代码几乎不覆盖这些类)可以用于压测标记的传递,目前仅发现了容器类org.jboss.threads.JBossThread没有覆盖该方法,但是由于其是从容器出发的第一个线程,在调用结束的时候我们会显式地remove TransmittableThreadLocal里面的值,所以没有影响。 在“子”线程结束工作使把其TransmittableThreadLocal里面的值还原为初始状态 这个功能我并不理解在现实中的使用场景? 能不能解释一下为何要如此设计而不是直接清空,因为我们目前的场景的话,其是还原为之前的状态就是清空,只有当threadlocal在线程池中使用完毕后不remove,下次父线程再通过executeService开启子线程使用时,该功能会起作用,但是本人在开发过程中从来没有遇到过该场景 |
|
public static ExecutorService createTracerExecutorService(ExecutorService executorService) {
return TtlExecutors.getTtlExecutorService(executorService);
} |
说一下您的公司、使用场景、使用项目、开始使用时间、使用方式等信息
# 如有敏感的信息,说个大概就好了
谢谢!
The text was updated successfully, but these errors were encountered: