【问题标题】:Tomcat In-Memory Caching - replication on ClusterTomcat 内存缓存 - 集群上的复制
【发布时间】:2018-06-27 10:58:57
【问题描述】:

我有一个关于 Tomcat 集群的问题。我有一个 java 应用程序,我们在其中实现了内存缓存。所以基本上当 Tomcat 启动时,它会从数据库中加载一些对象。这些对象像静态对象一样存储在tomcat内存中。因此,每当我们从应用程序更新某些内容时,它都会写入数据库并更新内存中的对象。

我的问题是,如果我们用 2 个或更多节点在 tomcat 中实现集群,那些缓存的对象也会被共享吗?那可能吗?我不认为它是。可以使用 tomcat delta manager 或备份管理器提供的会话复制来共享 HttpSession 对象。但是内存中的东西也可以共享吗?

另外,正在运行的批处理作业会发生什么情况?它们是否还会运行多次,因为集群中会有多个 tomcat 实例并且它们都会触发作业?那也是失败的。

有什么想法\想法?

【问题讨论】:

    标签: java tomcat caching


    【解决方案1】:

    如果您将某些内容保存在内存中,除非您专门实施某些内容以将其发送到其他机器,否则它将不会被复制。每个 jvm 保持它们的内存相互独立。

    一般来说,如果你想要复制缓存,一个好的解决方案是使用 ehcache (http://www.ehcache.org/)。

    关于批处理作业,它取决于您使用的库,但通常,如果您使用已建立的库(如http://www.quartz-scheduler.org/),它应该能够确保只有一个实例运行该作业。也许你需要配置。

    重要的是要进行测试,以确保您实施的任何解决方案都能真正达到您的预期。

    祝你好运!

    【讨论】:

      【解决方案2】:

      每当迁移到集群或类似集群的拓扑时,您都需要修改您的应用解决方案设计/架构,以确保它支持多实例执行。

      1. 由给定 Tomcat 实例缓存在内存中的数据不会在集群中的实例之间共享。您需要将 Tomcat 实例之外的此类数据移动到共享缓存实例 - Redis 似乎是当今流行的选择。

      2. 作业执行可能需要修改和定制以由配置驱动。创建一个布尔标志,您的应用可以读取并在需要时启动批处理。在集群中选择您需要运行作业的节点并将标志设置为 true。在所有其他节点中将其设置为 false。 Quartz 不会确保/控制/管理在集群中运行的作业的多个实例。

      【讨论】:

        猜你喜欢
        • 2016-06-20
        • 2013-10-27
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 2016-06-08
        • 2018-06-29
        • 2019-07-19
        相关资源
        最近更新 更多