WildFly 10 HA 部署:不丢失会话

WildFly 10 HA deploy: not losing sessions

我整天都在阅读有关该主题的帖子和文档,但仍然找不到易于理解和信任的内容。

我目前将我的 webapp 部署在 WildFly 10 上,作为一个简单的 war 文件。

这是一个电子商务网站,生产了几周,每次我们需要部署一个新版本,好吧...这很烦人,因为一些客户现在可能正在购物,而部署会显然让他们失去了会话,这非常糟糕。

我需要一个解决方案来部署新的 war 而无需重新启动应用程序服务器。起初,我阅读了有关集群的文档(独立配置上的域配置),但我不确定这对我来说是否足够...

想象一下同一位客户在购物车(http 会话)中有几件商品,访问集群的第一个节点。 然后我把它放下,因为我正在部署。 好的,客户将被重定向到集群的第二个节点,但是……会话数据是否仍然可用?他会 'lose' 购物车中的商品吗?

我阅读了有关粘性会话的信息,但对在 WildFly 中配置它们一无所知。我在 Amazon AWS 上,所以我也可以使用 ELB(负载均衡器)。 您能帮助我准确了解我需要学习和使用的内容吗?

每个 WildFly 实例都有自己的会话 ID,保存在 cookie 中。这个 id 只会在它来自的特定节点上恢复会话。

粘性会话意味着 ELB 将始终将用户重定向到集群中的同一节点,因此这并不能完全解决您的问题。

一些需要思考的事情:

聚类

集群可能会有所帮助(不需要是域模式)。启用 HA 后,会话将自动在节点之间传输,以便客户端浏览器上的 cookie 能够在任一节点上恢复会话。这当然有一个问题,如果您先升级其中一个 war 文件,您可能会有一个对象因为它已更改而无法再反序列化。

在 AWS 上集群 WF 也有点棘手,因为您不能使用 UDP 广播来发现彼此。我们使用数据库连接来跟踪节点并进行集群。

自己动手

您可以做的一个选择是推出您自己的解决方案,以便根据需要在客户端上保留最少量的信息。类似于:

  1. 使用 GUID 在数据库中创建一条记录。
  2. 将 GUID 设置为 cookie
  3. 根据 GUID 将购物车中的商品保存在数据库中
  4. 有一个过滤器来检查 GUID cookie,并且可以在他们每次访问该站点时恢复他们的购物车。

我过去对电子商务应用程序使用过类似的方法。它还有另一个副作用,您现在已将此人的购物车保存在您的数据库中,并且很容易准确地看到人们有兴趣购买什么。

使用Tomcat并行部署

您的应用程序是否需要完整的应用程序服务器?如果它只是基于 servlet,您可以尝试使用 Tomcat 和它的并行部署功能。它允许您在旧文件之上部署新的 .war 文件。然后它将继续为旧 war 提供旧会话,但新会话将转到新 war 文件。

如果您的应用足够简单,可以使用tomcat,那么并行部署非常酷tomcat。