Skip to content
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

TTL v3 project management #432

Open
26 of 60 tasks
oldratlee opened this issue Oct 5, 2022 · 15 comments
Open
26 of 60 tasks

TTL v3 project management #432

oldratlee opened this issue Oct 5, 2022 · 15 comments

Comments

@oldratlee
Copy link
Member

oldratlee commented Oct 5, 2022

关于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

已有的相关讨论:

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

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

TTL core

API 不兼容升级

❗️ 不兼容

  • TransmittableThreadLocal#copy方法名改成transmiteeValue
    • 虽然多数情况下,传递的是一个复杂的对象,习惯上会先想到的是如何做拷贝,如深拷贝、浅拷贝;这个方法copy是容易想到和理解这个过程与行为了。 😂
      • 这是也是为什么在TTL v2中,这个方法被命名成了copy的原因。
    • 但是『传递』是更严谨且合理的,因为并不一定有『拷贝』行为(比如简单的赋值传递)。
    • transmiteeValue命名也与JDKInheritableThreadLocal.childValue()方法名有了一致性。
  • ✨ 去除TransmittableThreadLocalbefore/after execute方法
  • 内部类TTL Transmitter上提到根包下,成为子包transmitter
    • 而不是内部类,核心概念不够一等公民
    • 也导致了核心的TransmittableThreadLocal类文件越写越长…
  • improve the type safety of transmitter #168
    • TTL TransmitterCRR方法 返回具体类型,而不是 Object
  • 删除(隐藏的)接口(本来就是不开放的接口,删除了实现更简单)
    • 删除(隐藏的)DisableInheritableThreadFactory接口
    • 删除(隐藏的)DisableInheritableForkJoinWorkerThreadFactory
  • 减少工具方法个数简化API
    • v2因为开关参数导致工具方法的个数太多了
    • reduce util method count of class ThreadLocalTransmitRegistry (9f19a97)
    • remove uncommon collection methods of TtlTimerTask, make API more concise (83c3be3)
  • ✨ rename package threadpool to executor(72c6b69)
  • 删除TtlUnwrap类,该类的方法合并到TtlWrappers类 (5b68280)
    v2中这些工具方法放在TtlUnwrap类中是为了支持Java 6v3支持Java 8+,不再需要这么做了。
  • 删除TtlForkJoinPoolHelper类,该类的方法合并到TtlExecutors类 (5b68280)
    原因同上
  • 删除v2@Deprecated的类与方法: (5b68280)
    • com.alibaba.ttl.TtlEnhanced
    • com.alibaba.ttl.TtlWrappers#wrap(...)

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

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

  • CRR概念/模式有普遍性,分离独立 可以对核心问题给出高水准与高强度的设计与实现。
  • 即使不被业界其它项目使用,只是TTL自身在使用,也可以提升TTL自身的设计与实现,如模块化/扩展性/概念分离。
    • 可以注册不同的ThreadLocal(如NettyFastThreadLocal),扩展性提升/三方平等的设计。
    • Transmittance生命周期回调(callback)的提供 是 清晰、规范的。
    • 设计的优化 可以带来 TTL自身实现的可靠性提升。
  • 显化核心概念:transmittertransmitteeCRR
  • 这个小框架要 独立/自包含,不能依赖上层(即TTL)。
    • TransmittableThreadLocal也只是CRR的一个普通使用方
    • TTL Transmitter类(TTL的使用方)仍以static方法的方式暴露TTL CRR操作
    • 上下文异常如何具体场景化?
  • CRR作为TTL开发扩展的下层API,与TTL用户API分离开。
    • 放在com.alibaba.crr包下
    • 注意:不位于com.alibaba.ttl3包下,在包名上也体现出了CRRTTL的独立性。
    • TransmittableThreadLocal创建、持有并注册TtlTransmittee(静态实例)。
      TTL Transmitter实例化TtlTransmittee并持有。
  • 🆕✨ 通过Transmitter支持before/after execute回调及其注册
    可以支持TTL v2的已有功能/v3中去除的功能(TransmittableThreadLocalbefore/after execute方法)
  • Transmitter支持before/after execute回调方法的调用是一致性的(4ba3dd6)
    • 一致性是指:对于注册的CrrTransmitCallback实例:
      • 收到回调beforeX就一定要收到afterX
      • 收到回调xReplay就一定要收到xRestore
    • 这样一致的回调 保证了,即使在回调中包含资源管理的逻辑也不会带来资源泄漏的问题。

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

TTL Agent

✨🆕 TTL Agent模块化

TTL Agent的扩展机制

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

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

  • 🆕 提供Agent的扩展机制

TTL Agent支持运行时加载生效

  • 🆕 支持运行时加载TTL Agent(aka. Agent Attach使用方式 ) #169
    TTL Agent支持运行时加载生效
  • 引入ConcurrentWeakMap/ConcurrentWeakHashMap (ade56ea)
    • Spring中有ConcurrentWeakHashMap实现
    • 注意:提供工厂方法以返回接口的实现的实例,实现类隐藏掉;这样方便后面切换(更好的)实现
    • 目前还没有引入ConcurrentWeakMap,实现内部使用,不需要复杂化
  • 通过ConcurrentWeakMap存储类实例与capture的关联 替代 在已有的类上新增capture字段
    • 这样的方案,不会给要增强的类新增字段(即不改变的类结构),从而Agent可以在运行时增强已有的类;
    • 但会增加GC负担,考虑只在运行时加载TTL Agent时使用这个方案。
  • 整理Agent开发相关的文档到
    支持运行时加载TTL Agent(aka. Agent Attach使用方式 ) #169

配置体验优化

  • 🆕 使用-D properties来配置TTL Agent,而不是Agent参数。
    • 更友好方便,Agent参数写起来读起来繁琐易错。

Agent字节码实现

  • 改用byte-buddy实现

测试

  • v2单元测试迁移到v3
    • TTL core模块
    • TTL Agent模块

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

文档

  • 更新markdown文档中的文件链接,因为模块移动了目录
  • v3文档中去除v2的版本新功能说明,v3v2功能都一开始就有的
  • 业务场景中,说明上典型的业务上下文,如登录/授权的用户ID、平台的租户ID

ttl2-compatible的实现成代理到TTL3

  • 需要 在v2的相关方法(如check)中,兼容逻辑
    添加通过v3实现类来判断的兼容逻辑
  • 添加@Deprecated及其说明
    • 说明包含:推荐使用v3v3的用法、v3v2不兼容的内容

生态集成支持

往往涉及APIAgent两者的支持

🆕✨ Kotlin支持

🆕✨ Spring/SpringBoot集成

Misc

待细化展开

优化(如性能)

@mingyang66
Copy link

v3有没有发布的时间点?

@oldratlee
Copy link
Member Author

oldratlee commented Oct 18, 2022

v3有没有发布的时间点?

还没有定 😄 @mingyang66

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

谢谢关注 💕


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

@mingyang66
Copy link

v3有没有发布的时间点?

还没有定 😄 @mingyang66

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

谢谢关注 💕

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

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

@haoyongdong
Copy link

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

@oldratlee
Copy link
Member Author

oldratlee commented Apr 10, 2023

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

@haoyongdong

  • 集成的这部分内容,可以做的要做的比较多。 😂
    • 对于使用多、问题明显的,优先级高。 💕
  • PS: 整体TTL v3没有定发布节奏,原因见上面的评论内容

@haoyongdong
Copy link

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

@oldratlee
Copy link
Member Author

oldratlee commented Apr 10, 2023

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

嗯嗯 ❤️ @haoyongdong

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

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

@darknesstm
Copy link

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

@cxntsh
Copy link

cxntsh commented May 15, 2023

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

嗯嗯 ❤️ @haoyongdong

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

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

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

@oldratlee
Copy link
Member Author

oldratlee commented May 16, 2023

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

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

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

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

@saoxuequ
Copy link

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

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

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

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

@oldratlee
Copy link
Member Author

oldratlee commented May 29, 2023

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

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

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

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


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

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

@hxd123456
Copy link

hxd123456 commented Jul 11, 2023

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

嗯嗯 ❤️ @haoyongdong

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

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

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

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

@ashinewu
Copy link

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

@oldratlee
Copy link
Member Author

oldratlee commented Dec 13, 2023

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants