将 ehcache 用于通过 docker 部署的应用程序,违反无状态规则

Posted

技术标签:

【中文标题】将 ehcache 用于通过 docker 部署的应用程序,违反无状态规则【英文标题】:Use ehcache for application deployed via docker against the stateless rule 【发布时间】:2017-09-17 20:28:47 【问题描述】:

我有一个 spring-boot 应用程序,我想将它部署到多个 docker 实例中,并且在实例之前有一个负载平衡。 但是,该应用程序使用 ehcache 来缓存数据库中的一些数据。它使应用程序有状态。 因此,如果没有会话粘性,同一个客户可能会点击不同的 docker 实例并看到不同的结果。 我的问题是,如果我不能在负载平衡中应用会话粘性,那么通过 docker 样式部署具有缓存功能的应用程序并且仍然遵守应该是无状态的规则的最佳实践是什么?

【问题讨论】:

缓存应该只是一个优化,你的用户应该看到相同的想法,无论他们点击什么实例。重新考虑您的应用设计或向我们提供更多数据。 【参考方案1】:

我在devoxx video 中解释了集群缓存如何帮助你们每个 docker 实例共享相同的缓存

【讨论】:

【参考方案2】:

通常将 ehcache 与 terracotta 结合使用,以允许在节点之间进行分布式缓存。

问候

【讨论】:

【参考方案3】:

首先,如果你真的有一个纯粹的缓存用例,那么应该不会影响正确性,只会影响性能。当然,这本身对您的应用程序来说可能是一件坏事。

但实际上,如果您想使用缓存来提供性能,同时拥有无粘性会话的多节点能力,您必须进入分布式缓存领域。这将使您能够在不同节点之间共享缓存内容,从而使会话中的给定请求(更)透明地命中应用程序的任何节点。

在 Ehcache 世界中,这意味着使用 Terracotta 服务器支持缓存,请参阅the documentation 了解详细信息。

【讨论】:

以上是关于将 ehcache 用于通过 docker 部署的应用程序,违反无状态规则的主要内容,如果未能解决你的问题,请参考以下文章

Docker中容器的备份恢复和迁移

docker将容器打包成镜像并传输至其他服务器部署(可用于容器重新run)

MySQL(17) 通过Docker搭建主从同步

如何通过不同的方法将相同的实体放入 EhCache

通过Docker部署OpenAuth.Core(一)

docker 通过中间镜像加速部署