通过使用 retrieve() 而不是 get() 来改进对 @Cacheable 暂停函数的无阻塞支持

作者: thomasdac创建于 2026年4月11日更新于 2026年9月8日
标签status: waiting-for-triagetheme: kotlin

□ 增强请求: 将 Kotlin Coroutines “ 暂停” 支持与 Reactive “ retriev” 管道对齐 QQ 具体使用大小写

在使用Spring WebFlux和Kotlin Coroutines的高通量"春靴"应用程序中,我们预计整个执行链是无阻的. 在悬浮函数上使用"QQCacheable"时,预计框架将发挥基础缓存的非阻塞能力(例如通过Lettuce或Cafeine的Redis).

然而,目前实施“CacheAspect支持”的做法将暂停功能与出版商类型(Mono/Flux)区别对待。 即使使用 " kotlinx-coroutines-Reactor " 桥,带有 " sync = false " (默认)的暂停函数也会触发同步的 " Cache.get(关键) " 呼叫。 在被动环境中,如果缓存访问缓慢或偏僻,这种同步调用会导致事件Loop/Worker线程被"撕裂"或饿死.

{\fn黑体\fs20\shad2\2aH82\3aH20\4aH33\fscx95\3cH592001\be1}我到现在为止一直试图解决这个

启用“ 同步 = 真 ” : 这是迫使拦截者使用取回方法(返回“可完成的未来”)的唯一方法。 虽然这使得流量不会被阻断,但它在缓存级别上引入了强制同步(locks),这常常是不可取的,因为我们只需要一个同步的搜索,而不需要协调锁的起落架.

手动桥:执行自定义缓存包,代表可以获得Async (. join (). 虽然这有作用,但它仍然消耗一线等待结果,而不是让克罗丁号在非阻塞管道中自然地暂停.

拟议变动

我已查明“Cache-Spect Support.java”中的不一致之处,它使暂停职能无法从反应性管道中受益:

增强将包括将悬浮函数返回作为"Async-First"公民,类似于Publisher. 由于Spring 6.1+已经承认了被暂停的功能,即使“sync = f造假”,截取器也应能够通过可检索/可完成的未来路径传送这些呼叫。 这将确保Coroutine悬浮装置在缓存I/O上真正不会被阻断,与项目反应堆类型的性能特征相匹配.

内容来源: spring-projects/spring-framework