【问题标题】:Publisher that emits new values when the cache is updated更新缓存时发出新值的发布者
【发布时间】:2021-05-02 13:44:19
【问题描述】:
有没有办法包装缓存并创建一个发布新值的发布者?
我有一个数据管道(由 Kafka Streams 提供)并且需要通过 GraphQL 订阅来提供结果。为了避免处理约 10k 临时消费者,我想预加载缓存。基本上我需要一个 Publisher 或 kotlin 协程 Flow 来包装缓存,监听更新事件并发出一个新值。
【问题讨论】:
标签:
caching
spring-webflux
kotlin-coroutines
project-reactor
spring-cache
【解决方案1】:
简答,不直接使用Spring's Cache Abstraction(API 或注释)。
在应用程序层,您需要编写一个 AOP 方面来封装在缓存更新后通过发布者发出事件的功能,然后组合并排序您的事件发出 (Spring) AOP 方面/Advice 通过Spring 的缓存抽象 将缓存建议应用于您的(例如)@Cacheable 带注释的应用程序服务方法。如果您希望将这种关注与应用程序逻辑保持一致,则可以这样做,这可以说是更可重用。
但是,另一种可能更简单的方法(取决于您的缓存提供程序)是简单地实现您的缓存提供程序本身提供的回调接口,如果确实这样回调存在。
例如,使用Apache Geode,可以将serve 作为Spring 的缓存抽象(& 框架)中的缓存提供者,您可以实现特定于应用程序的Apache Geode CacheListener 根据缓存更新的类型(例如创建、更新、销毁、失效(通常由到期触发)等),您需要的行为。不过,此接口缓存提供者 依赖。但是,另一方面,这会更可靠,因为缓存肯定是由于@Cacheable 应用程序服务方法触发的缓存操作而改变的。
无论如何,我希望这能给你一些想法。里程不同。
干杯!