TTL v3 project management

Author: oldratleeCreated Oct 5, 2022Updated Sep 18, 2026
Labels✨ feature📚 documentationtask_❤️__🔥_📐 design discussionttl agentt:v3 ✨

关于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 不兼容升级

❗️ 不兼容

  • TransmittableThreadLocal#copy方法名改成transmiteeValue
    • 虽然多数情况下,传递的是一个复杂的对象,习惯上会先想到的是如何做拷贝,如深拷贝、浅拷贝;这个方法copy是容易想到和理解这个过程与行为了。
      • 这是也是为什么在TTL v2中,这个方法被命名成了copy的原因。
    • 但是『传递』是更严谨且合理的,因为并不一定有『拷贝』行为(比如简单的赋值传递)。
    • transmiteeValue命名也与JDKInheritableThreadLocal.childValue()方法名有了一致性。
  • ✨ 去除TransmittableThreadLocalbefore/after execute方法
  • 内部类TTL Transmitter上提到根包下,成为子包transmitter
    • 而不是内部类,核心概念不够一等公民
    • 也导致了核心的TransmittableThreadLocal类文件越写越长…
  • ✨ #168
    • TTL TransmitterCRR方法 返回具体类型,而不是 Object
  • 删除(隐藏的)接口(本来就是不开放的接口,删除了实现更简单)
    • 删除(隐藏的)DisableInheritableThreadFactory接口
    • 删除(隐藏的)DisableInheritableForkJoinWorkerThreadFactory
  • 减少工具方法个数简化API
    • v2因为开关参数导致工具方法的个数太多了
    • reduce util method count of class ThreadLocalTransmitRegistry (9f19a975ba5a25ea90eaca4f418704b015de5eeb)
    • remove uncommon collection methods of TtlTimerTask, make API more concise (83c3be3e86207b0b45ec2f0dcc59c1242936c4b6)
  • ✨ rename package threadpool to executor(72c6b6916f81e7b51f9ef572ce6a34b528eefd3e)
  • 删除TtlUnwrap类,该类的方法合并到TtlWrappers类 (5b6828071b5f158d50f38f978706e0e0d32d547c) 在v2中这些工具方法放在TtlUnwrap类中是为了支持Java 6v3支持Java 8+,不再需要这么做了。
  • 删除TtlForkJoinPoolHelper类,该类的方法合并到TtlExecutors类 (5b6828071b5f158d50f38f978706e0e0d32d547c) 原因同上
  • 删除v2@Deprecated的类与方法: (5b6828071b5f158d50f38f978706e0e0d32d547c)
    • 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回调方法的调用是一致性的(4ba3dd663f1ce15c9288dd86cec07c822e0118ba)
    • 一致性是指:对于注册的CrrTransmitCallback实例:
      • 收到回调beforeX就一定要收到afterX
      • 收到回调xReplay就一定要收到xRestore
    • 这样一致的回调 保证了,即使在回调中包含资源管理的逻辑也不会带来资源泄漏的问题。

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

TTL Agent

TTL Agent模块化

  • #260
    • 分离Agent JarAPI Jar
    • 这样API包大小很小,用户运行时依赖不exclude TTL包而冗余了也成本小
    • 方便Agent包支持不同的打包格式,不同场景使用友好
  • 提供没有shade依赖的TTL Agent
    • 方便方便使用方repackage/shade依赖
    • 打包TTL Agent到自己的Agent包中,并且共享一份shade的依赖(如字节码库)
    • 具体设计、实现与使用方式,可以参照byte-buddy
  • 提供常用的Agent打包格式
    • #405

TTL Agent的扩展机制

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

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

  • 提供Agent的扩展机制

TTL Agent支持运行时加载生效

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

  • Kotlin语言的一等公民支持 #119
  • ✨ 支持/集成kotlin coroutine支持 #118
    • API支持
    • Agent支持

Spring/SpringBoot集成

  • 执行器wrapper支持Spring,集成Spring Async Executors #173
    • 简化使用,在效果上像Agent但配置更简单
    • 感觉『Bean注入时拦截做包装』更好,不是『Bean生成时拦截』
    • API支持。参考项目Dreamroute/ttl-spring-boot-starter
      • 提供Spring/SpringBoot注解,如@EnableTtlExecutor@SkipTttlWrapper
    • Agent支持
  • 提供session cacheSpring支持

Misc

待细化展开

  • #499
  • 集成RxJava
  • 集成hystrix
  • 集成VertX
  • 集成SkyWalking
  • 集成AKKA
  • #109

优化(如性能)

  • TtlAttachments没有使用时不创建,比如在TtlRunnable中的使用
  • 异常捕捉处理:不要捕捉Throwable,只捕捉NonFatal Exception (8eb51d4c30e7e3a2e3975ada82fc95d57d182cef)
  • performance optimization, use expected size to initialize hash map instead of capacity(8590e2558cd1c81489e26debd47ad65f18fba17e)
  • fix wrong equals/hashCode implementations of TTL wrappers (4f186071ef84b334a11cb99374f73b627bd088c6)
  • add ttl-bom (d5730530fc19440e99d495d0c23c392b6430a86e)

Source: alibaba/transmittable-thread-local