关于TransmittableThreadLocal(TTL) v3
🚧 TransmittableThreadLocal(TTL) v3 在开发中(在master分支),还没有发布。
新功能推荐都在v3中提供,原因:
TTL域的核心问题(包含了可扩展的能力、不包含扩展的实现)在v2解决了,并且稳定;
TTL核心功能,v2已经是开放的
- 如果你觉得有必要或是喜欢想试一下,
可以用自己的实现来替代最核心TransmittableThreadLocal类实现
- 这让维持
v2聚焦v3升级 成为可能。
- 避免
v2老版本的 并行大维护工作 与 保持兼容性的历史包袱(如不优或过度的设计、对低版本Java的支持),从而在v3聚焦输出有价值的工作。
v3作为在大版本升级,可以是不兼容升级
- 当然会提供
TTL v2的兼容包(即ttl2-compatible 3.x模块),以简化用户的升级过程
- 通过
v3有价值的新功能可以引导大家从v2升级、试用/使用、优化v3。
已有的相关讨论:
下面是v3的工作项列表及其进展。
TTL core
API 不兼容升级
❗️ 不兼容
Transmittance/CRR分离成独立包(成为一个小框架)
就像 https://github.com/reactive-streams/reactive-streams-jvm
这种 核心小框架 抽象后,相信意义很大:
CRR概念/模式有普遍性,分离独立 可以对核心问题给出高水准与高强度的设计与实现。
- 即使不被业界其它项目使用,只是
TTL自身在使用,也可以提升TTL自身的设计与实现,如模块化/扩展性/概念分离。
- 可以注册不同的
ThreadLocal(如Netty的FastThreadLocal),扩展性提升/三方平等的设计。
Transmittance生命周期回调(callback)的提供 是 清晰、规范的。
- 设计的优化 可以带来
TTL自身实现的可靠性提升。
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的集成往往涉及API与Agent两者的支持。
✨ TTL Agent支持运行时加载生效
配置体验优化
Agent字节码实现
测试
注意:原则上,v2的测试代码一行不能改,以确保尽量发现兼容包的v2功能break。
文档
ttl2-compatible的实现成代理到TTL3
生态集成支持
往往涉及API与Agent两者的支持
🆕✨ Kotlin支持
🆕✨ Spring/SpringBoot集成
Misc
待细化展开
优化(如性能)
关于
TransmittableThreadLocal(TTL)v3新功能推荐都在
v3中提供,原因:TTL域的核心问题(包含了可扩展的能力、不包含扩展的实现)在v2解决了,并且稳定;TTL核心功能,v2已经是开放的可以用自己的实现来替代最核心
TransmittableThreadLocal类实现v2聚焦v3升级 成为可能。v2老版本的 并行大维护工作 与 保持兼容性的历史包袱(如不优或过度的设计、对低版本Java的支持),从而在v3聚焦输出有价值的工作。v3作为在大版本升级,可以是不兼容升级TTL v2的兼容包(即ttl2-compatible 3.x模块),以简化用户的升级过程v3有价值的新功能可以引导大家从v2升级、试用/使用、优化v3。下面是
v3的工作项列表及其进展。TTL core
API 不兼容升级
TransmittableThreadLocal#copy方法名改成transmiteeValuecopy是容易想到和理解这个过程与行为了。 😂TTL v2中,这个方法被命名成了copy的原因。transmiteeValue命名也与JDK的InheritableThreadLocal.childValue()方法名有了一致性。TransmittableThreadLocal的before/after execute方法TransmittableThreadLocal类是TTL的用户API,要尽量简化,包含的是核心功能(非外围/可附加的功能)Transmitter支持before/after execute回调的注册Transmitter是TTL的开发者API;开发者角色可以关注生命周期这样完备也复杂的问题TTL Transmitter上提到根包下,成为子包transmitterTransmittableThreadLocal类文件越写越长…TTL Transmitter的CRR方法 返回具体类型,而不是ObjectDisableInheritableThreadFactory接口DisableInheritableForkJoinWorkerThreadFactoryAPIv2因为开关参数导致工具方法的个数太多了ThreadLocalTransmitRegistry(9f19a97)TtlTimerTask, makeAPImore concise (83c3be3)threadpooltoexecutor(72c6b69)TtlUnwrap类,该类的方法合并到TtlWrappers类 (5b68280)在
v2中这些工具方法放在TtlUnwrap类中是为了支持Java 6;v3支持Java 8+,不再需要这么做了。TtlForkJoinPoolHelper类,该类的方法合并到TtlExecutors类 (5b68280)原因同上
v2中@Deprecated的类与方法: (5b68280)com.alibaba.ttl.TtlEnhancedcom.alibaba.ttl.TtlWrappers#wrap(...)Transmittance/CRR分离成独立包(成为一个小框架)transmitter、transmittee、CRRTTL)。TransmittableThreadLocal也只是CRR的一个普通使用方TTL Transmitter类(TTL的使用方)仍以static方法的方式暴露TTL CRR操作CRR作为TTL开发扩展的下层API,与TTL用户API分离开。com.alibaba.crr包下com.alibaba.ttl3包下,在包名上也体现出了CRR与TTL的独立性。TransmittableThreadLocal创建、持有并注册TtlTransmittee(静态实例)。TTL Transmitter实例化TtlTransmittee并持有。Transmitter支持before/after execute回调及其注册可以支持
TTL v2的已有功能/v3中去除的功能(TransmittableThreadLocal的before/after execute方法)Transmitter支持before/after execute回调方法的调用是一致性的(4ba3dd6)CrrTransmitCallback实例:beforeX就一定要收到afterXxReplay就一定要收到xRestoreTTL Agent
✨🆕
TTL Agent模块化Agent Jar与API JarAPI包大小很小,用户运行时依赖不excludeTTL包而冗余了也成本小Agent包支持不同的打包格式,不同场景使用友好shade依赖的TTL Agent包repackage/shade依赖TTL Agent到自己的Agent包中,并且共享一份shade的依赖(如字节码库)byte-buddyAgent打包格式TTL Agent的扩展机制可以加载应用中的类增强的逻辑实现,但不需要三方提供
Java Agent实现;从而简化三方提供
Agent的类增强逻能力。TTL的集成往往涉及API与Agent两者的支持。Agent的扩展机制✨
TTL Agent支持运行时加载生效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单元测试迁移到v3TTL core模块TTL Agent模块注意:原则上,
v2的测试代码一行不能改,以确保尽量发现兼容包的v2功能break。文档
markdown文档中的文件链接,因为模块移动了目录v3文档中去除v2的版本新功能说明,v3中v2功能都一开始就有的ttl2-compatible的实现成代理到TTL3v2的相关方法(如check)中,兼容逻辑添加通过
v3实现类来判断的兼容逻辑@Deprecated及其说明v3、v3的用法、v3与v2不兼容的内容生态集成支持
往往涉及
API与Agent两者的支持🆕✨
Kotlin支持Kotlin语言的一等公民支持 First-class support for Kotlin language #119kotlin coroutine支持 the kotlin coroutine integration #118API支持Agent支持🆕✨
Spring/SpringBoot集成wrapper支持Spring,集成Spring Async ExecutorsTTL支持Spring的ThreadPoolTaskExecutor,如提供getTtlAsyncTaskExecutor #173Agent但配置更简单API支持。参考项目Dreamroute/ttl-spring-boot-starterSpring/SpringBoot注解,如@EnableTtlExecutor,@SkipTttlWrapperAgent支持session cache的Spring支持Misc
待细化展开
Spring Reactor#499RxJavahystrixVertXSkyWalkingAKKA优化(如性能)
TtlAttachments没有使用时不创建,比如在TtlRunnable中的使用Throwable,只捕捉NonFatal Exception(8eb51d4)scala.util.controlexpected sizeto initializehash mapinstead ofcapacity(8590e25)equals/hashCodeimplementations of TTL wrappers (4f18607)ttl-bom(d573053)