我们有一个安静的网络服务。我们使用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从负载均衡器后面的多个实例刷新缓存?
答案 0 :(得分:0)
简而言之,你不能这样做。您无法控制将您的请求转发到哪个后端服务器实例以清除缓存。这就是我们毕竟拥有负载均衡器的原因,不是吗? LB控制请求的位置(到哪个服务器)。
在旁注中,您为什么要从前台设置中清除缓存,即通过LB?您必须拥有系统才能从后台(即位于应用服务器旁边的系统)中清除缓存,并且可以在没有LB的情况下访问这两个应用服务器。
答案 1 :(得分:0)
您可以使用一些解决方案。当一个节点获得清除缓存的请求时,您可以在JMS主题上放置一条消息,并允许所有节点读取该消息以清除缓存。
答案 2 :(得分:0)
不确定什么是确切的业务逻辑,因为您尚未对其进行解释。但是,现在下面是您想到的一些方法。
从任何实例使用分布式缓存(半径)更新将反映所有实例。 -推荐。
使用基于池的缓存更新,每个服务器都将在数据库池中查找更新/删除。不建议这样做,因为随着缓存大小的增加,操作可能会很昂贵。
在KAFKA等消息传递平台上更新帖子,并让每个实例都注册一个使用方以更新本地缓存。
如果使用服务注册表,请读取所有服务器IP地址并跳过LB调用-不推荐。