【问题标题】:Distributed cache synchronization on multiple service instances using Guava Cache使用 Guava Cache 在多个服务实例上进行分布式缓存同步
【发布时间】:2020-04-22 17:38:39
【问题描述】:

我在我的服务中使用 Guava Cache 来缓存数据库,并且我正在使用 REST 调用来invalidate/refresh 缓存内容。我的设置包含我的service 的 10 个分布式实例的部署。

在多个实例的缓存之间保持同步的最佳做法是什么?理想情况下,如果我向 1 个实例发送缓存 update REST 调用,那么我希望它在其余 9 个实例上触发相同的调用。

我想避免使用远程缓存解决方案以避免额外的 REST 调用和相关的网络延迟。

【问题讨论】:

  • 问题与machine-learning 无关 - 请不要向无关标签发送垃圾邮件(已删除)。

标签: java spring caching guava


【解决方案1】:

如果您不想使用像 Redis 这样的分布式缓存系统,那么您正在查看的是在您的服务层中有另一个端点,它可以发送/接收来自另一个服务实例的 REST 调用(以及缓存值加上缓存元数据)一旦发生缓存失效(驱逐)或 TTL 刷新事件以更新您的内存中 Guava 缓存层。

【讨论】:

    【解决方案2】:

    Guava Cache 与分布式应用程序无关,它在内存中定义为单个 JVM。

    如果您需要做分布式缓存,请考虑:

    1. 使用其他工具(例如 Hazelcast 或 Apache Ignite
    2. 使用 Redis - 它将在 Redis 服务上存储单个数据副本,但对其的查询速度非常快,尽管不如内存调用快。但是,如果您使用缓存,则数据可能很少更新但经常被查询,所以也许您可以将 redis 与一些内存映射结合使用 + 向所有实例(pub-sub)发送消息,一旦一个实例上的缓存得到更新。即使在 Redis 中,也有一个 pub sub 可以完成这种工作,或者如果你已经拥有它们,你可以使用 RabbitMq、ActiveMQ 等消息系统。
    3. 使用数据库 + 消息传递 - 类似于“2”,但数据的单个副本将存储在数据库中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-25
      • 2014-05-01
      • 2017-06-18
      • 2011-03-19
      • 1970-01-01
      • 2021-09-16
      • 2012-05-13
      • 2019-10-23
      相关资源
      最近更新 更多