【问题标题】:clearing cache from multiple servers behind load balancer从负载均衡器后面的多个服务器清除缓存
【发布时间】:2015-04-10 23:07:05
【问题描述】:

我们有一个宁静的网络服务。我们正在使用 JaxRs 的 CacheControl 来缓存 GET 端点的响应 xml。

例如:GET - https://api.apiway.com/v1/users/12345

要清除缓存,我需要使用 PUT(而不是 GET)访问相同的端点,并且将为该端点清除缓存。

例如:PUT - https://api.apiway.com/v1/users/12345

当我在我只有 1 个 websphere 实例运行的本地运行它时,它运行良好。但是我们的 QA 环境有 2 个 webphere 实例在负载均衡器后面运行。因此,当我调用 PUT 端点刷新缓存时,它只会清除 1 个 websphere 实例上的缓存,而另一个 websphere 实例将发送过期数据响应。

如何使用 cacheControl 从负载均衡器后面的多个实例中刷新缓存?

【问题讨论】:

  • 你是如何维护这个缓存的?
  • 缓存在服务器端。

标签: java web-services jakarta-ee caching jax-rs


【解决方案1】:

您可以使用一些解决方案。当一个节点收到清除缓存的请求时,您可以在 JMS 主题上放置一条消息,并允许所有节点读取该消息以清除缓存。

【讨论】:

    【解决方案2】:

    不确定什么是确切的业务逻辑,因为您没有解释它。但是,现在下面是一些想到的方法。

    1. 使用来自任何实例的分布式缓存(半径)更新将反映所有实例。 - 推荐。

    2. 使用基于池的缓存更新,每台服务器都会在 DB 上进行池以查找更新/删除。不推荐,因为随着缓存大小的增加,这可能是昂贵的操作。

    3. 在 KAFKA 等消息传递平台上发布更新,并让每个实例注册一个消费者来更新本地缓存。

    4. 如果使用服务注册表,读取所有服务器 IP 地址并跳过 LB 调用 - 不推荐。

    【讨论】:

      【解决方案3】:

      简而言之,你不能这样做。您无法控制将与您的请求一起转发哪个后端服务器实例以清除缓存。这就是我们拥有负载均衡器的原因,不是吗? LB 控制请求的去向(到哪个服务器)。

      附带说明,为什么要从前台设置清除缓存,即通过 LB?您必须有系统从后台清除缓存,即从位于应用服务器旁边的系统中清除缓存,并且可以在没有 LB 的情况下访问两个应用服务器。

      【讨论】:

      • 有了LBs,这可能是一个常见的情况,有多种方法可以解决这个问题。上面的解释很好,但不要回答问题。
      猜你喜欢
      • 2011-10-26
      • 2013-01-04
      • 2010-10-20
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多