我对Tomcat群集有疑问。我有一个java应用程序,我们在其中实现了内存缓存。所以基本上当Tomcat启动时,它会从数据库中加载一些对象。这些对象像静态对象一样存储在tomcat内存中。因此,每当我们从应用程序更新某些内容时,它都会写入数据库并更新内存中的对象。
我的问题是,如果我们在具有2个或更多节点的tomcat中实现集群,那么这些缓存的对象是否也会被共享?那可能吗?我不这么认为。可以使用tomcat delta manager或backup manager提供的会话复制来共享HttpSession对象。但是内存中的东西也可以共享吗?
此外,正在运行的批处理作业会发生什么?它们是否也会多次运行,因为群集中会有多个tomcat实例,它们每个都会触发这个工作?那将是一次失败。
任何想法\想法?
答案 0 :(得分:0)
如果您在内存中保存了某些内容,除非您专门实施某些内容以将其发送到其他计算机,否则不会对其进行复制。每个jvm都保持彼此独立的记忆。
通常,如果您想要复制缓存,一个好的解决方案是使用ehcache(http://www.ehcache.org/)。
关于批处理作业,它取决于您使用的库,但通常,如果您使用已建立的库(如http://www.quartz-scheduler.org/),它应该能够确保只有一个实例运行该作业。也许你需要配置。
重要的是要进行测试,以确保您实施的任何解决方案实际上都能达到预期目标。
祝你好运!答案 1 :(得分:0)
每当移动到集群或类似集群的拓扑时,您需要修改应用程序解决方案设计/体系结构,以确保它将支持多个实例执行。
给定Tomcat实例在内存中缓存的数据不会在群集中的实例之间共享。您需要将这些数据移到Tomcat实例之外的共享缓存实例 - Redis似乎是一种流行的选择。
可能需要修改和自定义作业执行以由配置驱动。创建一个应用程序可以读取的布尔标志,并根据需要启动批处理。选择群集中需要运行作业的节点,然后将标志设置为true。在所有其他节点中将其设置为false。 Quartz不会确保/控制/管理群集中运行的作业的多个实例。