分布式缓存预热

3
我有一个基于Spring的Web应用程序(war包),部署在Tomcat Web服务器上。该Web应用程序由几个服务器实例提供服务,每个实例都运行Tomcat的一个实例。我打算将一些数据缓存到Redis datastore中,所有应用程序实例都联系这个数据存储器来读取数据。在应用程序启动时,我想要在Redis中预先缓存一些数据。
如果通过Web应用程序进行操作,所有节点都会尝试初始化缓存。将其中一个实例作为leader是其中之一的选项,还有更好的解决方案吗?
  • 重新启动:表示:停止Tomcat,然后再次启动它。这可以出于多种原因:部署新版本的Web应用程序/服务器(机器)重启/添加到池中的新服务器。不大可能所有的tomcat实例同时启动,但其中一些可能在几乎相同的时间启动。
  • 缓存服务器独立于Web应用程序,但如果它也崩溃并且数据丢失了。我也将在Cache中维护“最后读取”的时间戳。

关于缓存预热的“最佳实践”,似乎很少有(或者根本没有)相关的文本,所以对于你敢于提出这个问题,我给予赞赏。但是,能否多提供一些细节呢?例如,对于运行在多个节点上的应用程序而言,重启意味着什么?为什么需要重启?为什么应用程序节点外部的缓存内容无法在重启后生存下来呢? - cruftex
@cruftex 感谢您的评论。我已经添加了更多的上下文。 - TJ-
你如何知道哪些键需要预热? - cruftex
一个大致的想法:领导者选举意味着额外的复杂性,而且您希望所有节点都进行预热。鉴于要预热一个键空间,请定义一个顺序。在有序键空间内,使每个应用程序节点从随机偏移量开始,并在找到已经填充的键后停止。 - cruftex
1个回答

3
您至少有两个选择:
1. 从应用程序内部预热缓存。 2. 或者在外部进行预热。
这两种方法都有自己的特点,您可以从中得出解决方案。
## 在应用程序内部预热
您的应用程序内部拥有执行缓存预热的所有基础设施。如果缓存预热是幂等的,则让所有实例执行缓存预热可能是可以接受的。如果您不想让所有应用程序都处理缓存预热问题,那么您需要做出决策:
其他实例在缓存预热时要做什么?
我对这个问题有两个答案:
1. 忽略并继续启动。 2. 等待缓存预热完成。
在这两种情况下,您都可以使用带有超时的Redis CAS(比较和交换)来创建一个过期的分布式锁,以便最快启动的实例将进行预热,并在完成后释放锁定。
您还可以使用一个进程来处理这个挑战,将第一个实例部署到服务器上进行缓存预热。等待该应用程序完成其工作,然后您就可以为其他实例做好准备了。
## 在应用程序外部预热
通过在应用程序外部进行缓存预热,您不会遇到并发问题,但这需要在操作和开发方面进行一些努力。您需要有人(或某个进程)在应用程序启动/部署之前运行缓存预热。您还需要构建那段代码,以访问数据并将其放入缓存中。
构建领导模式也可以工作,但需要额外的代码/组件。如果可能,保持简单。
希望对您有所帮助,Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接