alibaba / transmittable-thread-local

📌 a missing Java std lib(simple & 0-dependency) for framework/middleware, provide an enhanced InheritableThreadLocal that transmits values between threads even using thread pooling components.
https://github.com/alibaba/transmittable-thread-local
Apache License 2.0
7.59k stars 1.69k forks source link

TTL v3 project management #432

Open oldratlee opened 1 year ago

oldratlee commented 1 year ago

关于TransmittableThreadLocal(TTL) v3

🚧 TransmittableThreadLocal(TTL) v3 在开发中(在master分支),还没有发布。

新功能推荐都在v3中提供,原因:

  1. TTL域的核心问题(包含了可扩展的能力、不包含扩展的实现)在v2解决了,并且稳定;
    • TTL核心功能,v2已经是开放的
      • 如果你觉得有必要或是喜欢想试一下,
        可以用自己的实现来替代最核心TransmittableThreadLocal类实现
    • 这让维持v2聚焦v3升级 成为可能。
  2. 避免 v2老版本的 并行大维护工作 与 保持兼容性的历史包袱(如不优或过度的设计、对低版本Java的支持),从而在v3聚焦输出有价值的工作。
    • v3作为在大版本升级,可以是不兼容升级
    • 当然会提供TTL v2的兼容包(即ttl2-compatible 3.x模块),以简化用户的升级过程
  3. 通过v3有价值的新功能可以引导大家从v2升级、试用/使用、优化v3

已有的相关讨论:

  • https://github.com/alibaba/transmittable-thread-local/issues/173#issuecomment-1166552079
    • TTL v3.x重点会是
    • 对常用的周边框架的使用做一等公民的体验优化支持。
      • 如,开发框架王者Spring/Spring Boot的集成
      • PS:JDK标准库涉及类的集成,v2已经做了
    • TTL Agent的扩展开放,方便三方自己做类增强的集成。
      • 执行组件很多,这些涉及的类增强,在TTL库中不可能都做支持
      • PS:用于框架集成的API(核心是Transmitter),v2已经开放了
    • ……
    • TTL核心功能,v2已经是开放的,即
    • 没有什么功能 只能在TTL库中才能实现。
    • 或说成,需要的功能 可以在TTL库外部来扩展实现。
    • TTL项目中,扩大集成范围,可以优化大家平时常用场景开箱即用的使用体验。
    • 其实,不少方便使用的TTL集成/增强,各个大厂是会有实现的,但并没开源出来;这些使用便利的地方值得进一步解决得更好。
  • https://github.com/alibaba/transmittable-thread-local/issues/405#issuecomment-1204756674
    • TTL v3会提供
    • shadeAPI依赖
    • 分离用户APIAgent成2个依赖
    • 也可以提供spring-boot loader + fatjar模式依赖
    • v3作为大版本升级,可以做不兼容的修改,清理掉不好的设计与实现;当然会提供TTL v2的兼容包。
    • v3会提供Kotlin语言的一等公民支持。
  • https://github.com/alibaba/transmittable-thread-local/issues/377#issuecomment-1107827776 到了现在,因为库的兼容性,也不能删除掉这个扩展点了 😢
  • https://github.com/alibaba/transmittable-thread-local/issues/412#issuecomment-1261459018
    • 如果你觉得TTL带的实现 不优 或是 可以结合你自己的业务场景来优化, TTL v2.14.0提供了 可以自己实现ThreadLocal注册的入口: 即不用TransmittableThreadLocal实现类,改用你自己的实现类。

下面是v3的工作项列表及其进展。

TTL core

API 不兼容升级

❗️ 不兼容

Transmittance/CRR分离成独立包(成为一个小框架)

就像 https://github.com/reactive-streams/reactive-streams-jvm 这种 核心小框架 抽象后,相信意义很大:

  • CRR概念/模式有普遍性,分离独立 可以对核心问题给出高水准与高强度的设计与实现。
  • 即使不被业界其它项目使用,只是TTL自身在使用,也可以提升TTL自身的设计与实现,如模块化/扩展性/概念分离。
    • 可以注册不同的ThreadLocal(如NettyFastThreadLocal),扩展性提升/三方平等的设计。
    • Transmittance生命周期回调(callback)的提供 是 清晰、规范的。
    • 设计的优化 可以带来 TTL自身实现的可靠性提升。

v2.14.0支持了ThreadLocal的注册,三方平等支持(如FastThreadLocalhttps://github.com/alibaba/transmittable-thread-local/releases/tag/v2.14.0

TTL Agent

✨🆕 TTL Agent模块化

TTL Agent的扩展机制

可以加载应用中的类增强的逻辑实现,但不需要三方提供Java Agent实现; 从而简化三方提供Agent的类增强逻能力。

TTL的集成往往涉及APIAgent两者的支持。

TTL Agent支持运行时加载生效

配置体验优化

Agent字节码实现

测试

注意:原则上,v2的测试代码一行不能改,以确保尽量发现兼容包的v2功能break。

文档

ttl2-compatible的实现成代理到TTL3

生态集成支持

往往涉及APIAgent两者的支持

🆕✨ Kotlin支持

🆕✨ Spring/SpringBoot集成

Misc

待细化展开

优化(如性能)

mingyang66 commented 1 year ago

v3有没有发布的时间点?

oldratlee commented 1 year ago

v3有没有发布的时间点?

还没有定 😄 @mingyang66

一方面,重构/新增的内容有些多,期望想得清楚些。 另一方面,有v2可用,倒不紧急。

谢谢关注 💕


大家如果有实际/目标的场景需求 可以提,以调整实现优先级和发布节奏。

mingyang66 commented 1 year ago

v3有没有发布的时间点?

还没有定 😄 @mingyang66

一方面,重构/新增的内容有些多,期望想得清楚些。 另一方面,有v2可用,倒不紧急。

谢谢关注 💕

大家如果有实际/目标的场景需求 可以提,以调整实现优先级和发布节奏。

OK,最近一直在关注TTL的更新

haoyongdong commented 1 year ago

集成SkyWalking这部分,请问打算怎么迭代呢,是否会成为skywalking的自定义插件模式支持~

oldratlee commented 1 year ago

集成SkyWalking这部分,请问打算怎么迭代呢,是否会成为skywalking的自定义插件模式支持~

@haoyongdong

haoyongdong commented 1 year ago

明白,感谢回复;最近在使用skywalking的多线程插件时遇到了些问题,发现如果测试应用使用了自定义加载器会导致切入异常,所以看到了TTL,有想用TTL替换skywalking中的多线程插件的想法

oldratlee commented 1 year ago

如果测试应用使用了自定义加载器会导致切入异常,所以看到了TTL

嗯嗯 ❤️ @haoyongdong

这个所涉及的「支持运行时加载TTL Agent #169」(即使只用在测试场景), 个人觉得优先级高。💪

darknesstm commented 1 year ago

SkyWalking目前在SpringCloudGateway中的问题较多,如果TTL能成为SW的上下文进程内容器就好了

cxntsh commented 1 year ago

如果测试应用使用了自定义加载器会导致切入异常,所以看到了TTL

嗯嗯 ❤️ @haoyongdong

这个所涉及的「支持运行时加载TTL Agent」(即使只用在测试场景), 个人觉得优先级高。💪

  • 实现思路 已经想得差不多了
  • 反馈Issue也比较多 参见上面内容 及其 相关已有Issue的讨论

大佬,能简单说下实现的的思路吗?我们自己内部也在尝试

oldratlee commented 1 year ago

能简单说下实现的的思路吗?我们自己内部也在尝试

@cxntsh 实现的的思路,在上面 issue 的正文中,有一些说明:

通过ConcurrentWeakMap存储类实例与capture的关联 替代 在已有的类上新增capture字段

  • 这样的方案,不会给要增强的类新增字段(即不改变的类结构),从而Agent可以在运行时增强已有的类;
  • 但会增加GC负担,考虑只在运行时加载TTL Agent时使用这个方案。
saoxuequ commented 1 year ago

hi @oldratlee !我正在尝试基于 master 实现如下功能:

通过ConcurrentWeakMap存储类实例与capture的关联 替代 在已有的类上新增capture字段

  • 这样的方案,不会给要增强的类新增字段(即不改变的类结构),从而Agent可以在运行时增强已有的类;
  • 但会增加GC负担,考虑只在运行时加载TTL Agent时使用这个方案。

但是当我在执行测试的时候发现代码不能正确的运行,请问 master 分支代码当前是处于不可正常运行状态吗?

oldratlee commented 1 year ago

请问 master 分支代码当前是处于不可正常运行状态吗?

master分支在持续集成且通过的。

因为在开发中(加新功能、去老逻辑),功能实现可能有不完整。

发现具体问题,开独立 issue 反馈吧 ❤️ @saoxuequ


如果目标是上生产环境,则基于2.x分支的稳定版本开发实现吧~ @saoxuequ

PS: 如果方便,推荐FORK实现开放,也方便大家具体查看排查&反馈优化。 ❤️ @saoxuequ

hxd123456 commented 1 year ago

如果测试应用使用了自定义加载器会导致切入异常,所以看到了TTL

嗯嗯 ❤️ @haoyongdong

这个所涉及的「支持运行时加载TTL Agent」(即使只用在测试场景), 个人觉得优先级高。💪

  • 实现思路 已经想得差不多了
  • 反馈Issue也比较多 参见上面内容 及其 相关已有Issue的讨论

大佬,请问这部分的实现现在有代码示例了吗?

我想通过使用ttl代替skywalking中的threadlocal作为上下文传递, 然后按照 #226 中所说先加载ttl agent,再加载skywalking agent, 尝试实现无侵入的全链路传递链路数据

ashinewu commented 9 months ago

@oldratlee 大佬,估计什么时候能完成kotlin协程的支持。现在kotin协程在后端用的越来越多啦!感谢大佬!

oldratlee commented 9 months ago

估计什么时候能完成kotlin协程的支持。现在kotin协程在后端用的越来越多啦!感谢大佬!

嗯嗯,KotlinKotlin协程两者都超赞 🚀 要一等公民高优支持。

Kotlin协程有些复杂,要花些时间理解与实现。 @ashinewu 有兴趣来实现吗?💗 😄