从负载均衡器后面的多个服务器清除缓存

时间:2015-02-10 19:05:32

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

我们有一个安静的网络服务。我们使用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从负载均衡器后面的多个实例刷新缓存?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

不确定什么是确切的业务逻辑,因为您尚未对其进行解释。但是,现在下面是您想到的一些方法。

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

  2. 使用基于池的缓存更新,每个服务器都将在数据库池中查找更新/删除。不建议这样做,因为随着缓存大小的增加,操作可能会很昂贵。

  3. 在KAFKA等消息传递平台上更新帖子,并让每个实例都注册一个使用方以更新本地缓存。

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