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

Java 从负载平衡器后面的多个服务器清除缓存,java,web-services,jakarta-ee,caching,jax-rs,Java,Web Services,Jakarta Ee,Caching,Jax Rs,我们有一个restful Web服务。我们使用JaxRs的CacheControl缓存GET端点的响应xml 例:得到- 要清除缓存,我需要使用PUT(而不是GET)命中同一个端点,并且该端点的缓存将被清除 例:将- 当我在本地运行它时,它工作得很好,我只有一个websphere实例在运行。但是我们的QA环境有两个WebSphere实例在负载平衡器后面运行。因此,当我调用PUT端点来刷新缓存时,它只会清除1个websphere实例上的缓存,而另一个websphere实例将发送带有过时数据的响应

我们有一个restful Web服务。我们使用JaxRs的CacheControl缓存GET端点的响应xml

例:得到-

要清除缓存,我需要使用PUT(而不是GET)命中同一个端点,并且该端点的缓存将被清除

例:将-

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


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

简而言之,您不能这样做。您无法控制哪个后端服务器实例将随清除缓存的请求一起转发。这就是为什么我们有负载平衡器,不是吗?LB控制请求的位置(到哪个服务器)


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

简而言之,您无法执行此操作。您无法控制哪个后端服务器实例将随清除缓存的请求一起转发。这就是为什么我们有负载平衡器,不是吗?LB控制请求的位置(到哪个服务器)


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

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

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

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

  • 从任何实例使用分布式缓存(radius)更新将反映所有实例。-推荐的

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

  • 在KAFKA等消息传递平台上发布更新,并让每个实例注册一个使用者以更新本地缓存

  • 如果使用service registry,请读取所有服务器IP地址并跳过LB调用-不推荐


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

  • 从任何实例使用分布式缓存(radius)更新将反映所有实例。-推荐的

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

  • 在KAFKA等消息传递平台上发布更新,并让每个实例注册一个使用者以更新本地缓存

  • 如果使用service registry,请读取所有服务器IP地址并跳过LB调用-不推荐


  • 你是如何维护这个缓存的?它是缓存在服务器端的。你是如何维护这个缓存的?它是缓存在服务器端的。有了LBs,这可能是一种常见的情况,有多种方法可以解决这个问题。上面的解释很好,但并没有回答这个问题。有了LBs,这可能是一种常见的情况,有多种方法可以解决这个问题。上面的解释很好,但并没有回答问题。