Open oldratlee opened 1 year ago
v3有没有发布的时间点?
v3有没有发布的时间点?
还没有定 😄 @mingyang66
一方面,重构/新增的内容有些多,期望想得清楚些。
另一方面,有v2
可用,倒不紧急。
谢谢关注 💕
大家如果有实际/目标的场景需求 可以提,以调整实现优先级和发布节奏。
v3有没有发布的时间点?
还没有定 😄 @mingyang66
一方面,重构/新增的内容有些多,期望想得清楚些。 另一方面,有
v2
可用,倒不紧急。谢谢关注 💕
大家如果有实际/目标的场景需求 可以提,以调整实现优先级和发布节奏。
OK,最近一直在关注TTL的更新
集成SkyWalking这部分,请问打算怎么迭代呢,是否会成为skywalking的自定义插件模式支持~
集成SkyWalking这部分,请问打算怎么迭代呢,是否会成为skywalking的自定义插件模式支持~
@haoyongdong
TTL v3
没有定发布节奏,原因见上面的评论内容明白,感谢回复;最近在使用skywalking的多线程插件时遇到了些问题,发现如果测试应用使用了自定义加载器会导致切入异常,所以看到了TTL,有想用TTL替换skywalking中的多线程插件的想法
如果测试应用使用了自定义加载器会导致切入异常,所以看到了TTL
嗯嗯 ❤️ @haoyongdong
这个所涉及的「支持运行时加载TTL Agent #169」(即使只用在测试场景), 个人觉得优先级高。💪
SkyWalking目前在SpringCloudGateway中的问题较多,如果TTL能成为SW的上下文进程内容器就好了
如果测试应用使用了自定义加载器会导致切入异常,所以看到了TTL
嗯嗯 ❤️ @haoyongdong
这个所涉及的「支持运行时加载TTL Agent」(即使只用在测试场景), 个人觉得优先级高。💪
- 实现思路 已经想得差不多了
- 反馈Issue也比较多 参见上面内容 及其 相关已有Issue的讨论
大佬,能简单说下实现的的思路吗?我们自己内部也在尝试
能简单说下实现的的思路吗?我们自己内部也在尝试
@cxntsh 实现的的思路,在上面 issue 的正文中,有一些说明:
通过
ConcurrentWeakMap
存储类实例与capture
的关联 替代 在已有的类上新增capture
字段
- 这样的方案,不会给要增强的类新增字段(即不改变的类结构),从而
Agent
可以在运行时增强已有的类;- 但会增加
GC
负担,考虑只在运行时加载TTL Agent
时使用这个方案。
hi @oldratlee !我正在尝试基于 master 实现如下功能:
通过ConcurrentWeakMap存储类实例与capture的关联 替代 在已有的类上新增capture字段
- 这样的方案,不会给要增强的类新增字段(即不改变的类结构),从而Agent可以在运行时增强已有的类;
- 但会增加GC负担,考虑只在运行时加载TTL Agent时使用这个方案。
但是当我在执行测试的时候发现代码不能正确的运行,请问 master 分支代码当前是处于不可正常运行状态吗?
请问 master 分支代码当前是处于不可正常运行状态吗?
master
分支在持续集成且通过的。
因为在开发中(加新功能、去老逻辑),功能实现可能有不完整。
发现具体问题,开独立 issue 反馈吧 ❤️ @saoxuequ
如果目标是上生产环境,则基于2.x
分支的稳定版本开发实现吧~ @saoxuequ
PS:
如果方便,推荐FORK
实现开放,也方便大家具体查看排查&反馈优化。 ❤️ @saoxuequ
如果测试应用使用了自定义加载器会导致切入异常,所以看到了TTL
嗯嗯 ❤️ @haoyongdong
这个所涉及的「支持运行时加载TTL Agent」(即使只用在测试场景), 个人觉得优先级高。💪
- 实现思路 已经想得差不多了
- 反馈Issue也比较多 参见上面内容 及其 相关已有Issue的讨论
大佬,请问这部分的实现现在有代码示例了吗?
我想通过使用ttl代替skywalking中的threadlocal作为上下文传递, 然后按照 #226 中所说先加载ttl agent,再加载skywalking agent, 尝试实现无侵入的全链路传递链路数据
@oldratlee 大佬,估计什么时候能完成kotlin协程的支持。现在kotin协程在后端用的越来越多啦!感谢大佬!
估计什么时候能完成kotlin协程的支持。现在kotin协程在后端用的越来越多啦!感谢大佬!
嗯嗯,Kotlin
与Kotlin
协程两者都超赞 🚀 要一等公民高优支持。
Kotlin
协程有些复杂,要花些时间理解与实现。
@ashinewu 有兴趣来实现吗?💗 😄
关于
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
方法名改成transmiteeValue
copy
是容易想到和理解这个过程与行为了。 😂TTL v2
中,这个方法被命名成了copy
的原因。transmiteeValue
命名也与JDK
的InheritableThreadLocal.childValue()
方法名有了一致性。TransmittableThreadLocal
的before/after execute
方法TransmittableThreadLocal
类是TTL
的用户API
,要尽量简化,包含的是核心功能(非外围/可附加的功能)Transmitter
支持before/after execute
回调的注册Transmitter
是TTL
的开发者API
;开发者角色可以关注生命周期这样完备也复杂的问题TTL Transmitter
上提到根包下,成为子包transmitter
TransmittableThreadLocal
类文件越写越长…TTL Transmitter
的CRR
方法 返回具体类型,而不是Object
DisableInheritableThreadFactory
接口DisableInheritableForkJoinWorkerThreadFactory
API
v2
因为开关参数导致工具方法的个数太多了ThreadLocalTransmitRegistry
(9f19a975ba5a25ea90eaca4f418704b015de5eeb)TtlTimerTask
, makeAPI
more concise (83c3be3e86207b0b45ec2f0dcc59c1242936c4b6)threadpool
toexecutor
(72c6b6916f81e7b51f9ef572ce6a34b528eefd3e)TtlUnwrap
类,该类的方法合并到TtlWrappers
类 (5b6828071b5f158d50f38f978706e0e0d32d547c) 在v2
中这些工具方法放在TtlUnwrap
类中是为了支持Java 6
;v3
支持Java 8+
,不再需要这么做了。TtlForkJoinPoolHelper
类,该类的方法合并到TtlExecutors
类 (5b6828071b5f158d50f38f978706e0e0d32d547c) 原因同上v2
中@Deprecated
的类与方法: (5b6828071b5f158d50f38f978706e0e0d32d547c)com.alibaba.ttl.TtlEnhanced
com.alibaba.ttl.TtlWrappers#wrap(...)
Transmittance/CRR
分离成独立包(成为一个小框架)transmitter
、transmittee
、CRR
TTL
)。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
回调方法的调用是一致性的(4ba3dd663f1ce15c9288dd86cec07c822e0118ba)CrrTransmitCallback
实例:beforeX
就一定要收到afterX
xReplay
就一定要收到xRestore
TTL Agent
✨🆕
TTL Agent
模块化Agent Jar
与API Jar
API
包大小很小,用户运行时依赖不excludeTTL
包而冗余了也成本小Agent
包支持不同的打包格式,不同场景使用友好shade
依赖的TTL Agent
包repackage
/shade
依赖TTL Agent
到自己的Agent
包中,并且共享一份shade
的依赖(如字节码库)byte-buddy
Agent
打包格式TTL Agent
的扩展机制可以加载应用中的类增强的逻辑实现,但不需要三方提供
Java Agent
实现; 从而简化三方提供Agent
的类增强逻能力。TTL
的集成往往涉及API
与Agent
两者的支持。Agent
的扩展机制✨
TTL Agent
支持运行时加载生效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
的版本新功能说明,v3
中v2
功能都一开始就有的ttl2-compatible
的实现成代理到TTL3
v2
的相关方法(如check
)中,兼容逻辑 添加通过v3
实现类来判断的兼容逻辑@Deprecated
及其说明v3
、v3
的用法、v3
与v2
不兼容的内容生态集成支持
往往涉及
API
与Agent
两者的支持🆕✨
Kotlin
支持Kotlin
语言的一等公民支持 #119kotlin coroutine
支持 #118API
支持Agent
支持🆕✨
Spring/SpringBoot
集成wrapper
支持Spring
,集成Spring Async Executors
#173Agent
但配置更简单API
支持。参考项目Dreamroute/ttl-spring-boot-starter
Spring/SpringBoot
注解,如@EnableTtlExecutor
,@SkipTttlWrapper
Agent
支持session cache
的Spring
支持Misc
待细化展开
RxJava
hystrix
VertX
SkyWalking
AKKA
优化(如性能)
TtlAttachments
没有使用时不创建,比如在TtlRunnable
中的使用Throwable
,只捕捉NonFatal Exception
(8eb51d4c30e7e3a2e3975ada82fc95d57d182cef)scala.util.control
expected size
to initializehash map
instead ofcapacity
(8590e2558cd1c81489e26debd47ad65f18fba17e)equals
/hashCode
implementations of TTL wrappers (4f186071ef84b334a11cb99374f73b627bd088c6)ttl-bom
(d5730530fc19440e99d495d0c23c392b6430a86e)