通过使用 retrieve() 而不是 get() 来改进对 @Cacheable 暂停函数的无阻塞支持
□ 增强请求: 将 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”中的不一致之处,它使暂停职能无法从反应性管道中受益:
** 定量查询**:对于暂停函数(大约[行541](https://GitHub.com/spring-projects/spring-framework/blob/main/spring-context/src/main/java/org/springframework/cache/interceptor/CacheAspect Support.java#L541)),逻辑回落到完全同步的InCaches。
** 反应优势**:相反, " 反应优势支持 " 逻辑(大约[行1143])(https://GitHub.com/spring-projects/blob/main/spring-context/src/main/java/org/springframework/cache/interceptor/Cache-SpectPassupport.java#L1143)采用了一种基于检索的方法,提供了完全非屏蔽的完成链条。
增强将包括将悬浮函数返回作为"Async-First"公民,类似于Publisher. 由于Spring 6.1+已经承认了被暂停的功能,即使“sync = f造假”,截取器也应能够通过可检索/可完成的未来路径传送这些呼叫。 这将确保Coroutine悬浮装置在缓存I/O上真正不会被阻断,与项目反应堆类型的性能特征相匹配.
内容来源: spring-projects/spring-framework