我有一个Web应用程序(基于Spring的战争),它部署在Tomcat网络服务器中。此Web应用程序由多个服务器实例提供服务,每个服务器实例都运行Tomcat实例。我打算在Redis数据存储上缓存一些数据,并且所有应用程序实例都联系此数据存储区以读取数据。作为预备步骤,我希望在应用程序启动时将一些数据缓存在Redis中。
如果我通过网络应用程序执行此操作,则所有节点都将尝试初始化缓存。让其中一个实例成为领导者是其中一个选择,有没有更好的解决方案呢?
答案 0 :(得分:0)
这里至少有两个选项:
任何一种方法都有自己的属性,从这里你可以得到一个解决方案。
您的应用程序内部包含执行缓存预热的所有基础结构。如果高速缓存变暖是幂等的,那么所有实例都可以完成它。如果您不希望将所有应用程序与缓存变暖一起处理,那么您需要做出决定:
当缓存变暖时,其他实例会做什么?
我对这个问题有两个答案:
在这两种情况下,您都可以使用带有超时的Redis CAS(比较和交换)来创建一个过期的分布式锁定,这样最快的启动实例将完成升温并在完成后释放锁定。
您还可以通过将第一个实例部署到执行缓存预热的服务器的流程来解决这一挑战。你等到该应用程序完成了它的工作,然后你就可以去其他实例了。
随着应用程序之外的缓存变暖,您不会遇到并发问题,但这需要在运营和开发方面付出一些努力。在应用程序启动/部署之前,您需要运行缓存预热的某个人(或某个进程)。您还需要构建一段代码来访问您的数据并将其放入缓存中。
构建领导者模式也可以工作,但需要额外的代码/组件。如果可以,请保持简单。
HTH,马克