微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 Kafka 失效的多个应用程序实例的 Spring 本地缓存

如何解决通过 Kafka 失效的多个应用程序实例的 Spring 本地缓存

我有一个常用的 SpringBoot 应用程序,它执行大量的数据库调用,对于那些我想使用普通 @Cacheable / @Cacheevict 和其他注释实现一些 Spring 缓存的应用程序(认情况下,我使用 caffeineCache)。有多个 AKS 节点,每个节点上都在运行我的应用程序的一个实例。我想收到什么:

  • 本地(内存中) Spring 缓存。基于 Redis 的分布式解决方案并不合适。
  • 在更新其中一个应用程序实例后,所有正在运行的应用程序实例的缓存都应该失效。
  • 我有一个全局 Kafka 服务,它将每个写入/更新请求注册到我的 Cassandra DB

现在我的问题 - 是否可能有一个本地的、通常的 Spring 缓存,并通过 Kafka 进行这样的失效,这当然会导致所有实例上的缓存版本同步?

解决方法

我会说原则上是可能的。您可以构建一个简单的解决方案,其中

  • 读取操作使用 @Cacheable
  • 写操作将消息放入 Kafka 总线,每个节点都有一个监听器,使用 @CachePut 将其写入本地缓存。

但这种幼稚的解决方案不会有任何严格的同步保证,它只是最终一致。将更新传播到其他节点需要时间,并且在其他节点之间仍然可以读取旧值。此外,您还必须考虑更新可能丢失的错误情况。

如果你想有更严格的保证,你需要多阶段提交或共识协议。除非它是一个研究项目,否则我非常不鼓励你自己写一个。这些不是微不足道的,因为问题并不微不足道。相反,您应该使用现有的实现。

总之:如果你不需要一致性,你可以按照你的建议去做。如果您需要任何级别的一致性保证,您应该使用现有的分布式缓存,它仍然可以与 @Cacheable 集成。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。