Session WildFly 10 HA部署:不会丢失会话

Session WildFly 10 HA部署:不会丢失会话,session,deployment,jboss,wildfly,high-availability,Session,Deployment,Jboss,Wildfly,High Availability,我整天都在阅读关于这个话题的帖子和文档,但仍然找不到容易理解和信任的东西 我目前在WildFly 10上部署了我的webapp,作为一个简单的war文件 这是一个电子商务网站,在生产几个星期,每次我们需要部署一个新的版本,嗯。。。这非常烦人,因为一些客户可能正在购物,部署显然会使他们丢失会话,这非常糟糕 我需要一个解决方案来部署新的war,而无需重新启动应用程序服务器。起初,我阅读了关于集群的文档(独立配置上的域配置),但我不确定这对我来说是否足够 想象一下,同一个客户在购物车(http会话)中

我整天都在阅读关于这个话题的帖子和文档,但仍然找不到容易理解和信任的东西

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

这是一个电子商务网站,在生产几个星期,每次我们需要部署一个新的版本,嗯。。。这非常烦人,因为一些客户可能正在购物,部署显然会使他们丢失会话,这非常糟糕

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

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

我读过关于粘性会话的内容,但没有读过关于在WildFly中配置它们的内容。我在AmazonAWS上,所以我也可以使用ELB(负载平衡器)。
你能帮我准确地理解我需要学习和使用什么吗?

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

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

需要考虑的一些事情:

聚类

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

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

自己动手

您可以做的一个选择是滚动您自己的解决方案,以根据需要在客户机上保留最少的信息量。比如:

  • 使用GUID在数据库中创建记录
  • 将GUID设置为cookie
  • 根据GUID将购物车中的项目保存到数据库中
  • 有一个过滤器,用于检查GUID cookie,并可以在每次访问站点时还原他们的购物车
  • 我过去曾在电子商务应用程序中使用过类似的方法。它还有另一个副作用,即您现在将此人的购物车保存在您的数据库中,并且很容易看到人们对购买感兴趣的内容

    使用Tomcat并行部署

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


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

    回答得很好。非常感谢。让我问你一件事,你说:“我们使用数据库连接来跟踪节点并进行集群”你能告诉我更多关于你是如何做到这一点的细节吗?我一直想写一篇关于这一点的博客文章。基本上,您必须创建一个使用JDBC_-PING的jgroups堆栈。我有一个用于WF9的standalone.xml变量,它在这里实现了这一点:查看从第336行开始的块。您可以在WF10中执行相同的配置。每个服务器将在JGROUPSPING表中的数据库中注册自己,而不是使用UDP来发现彼此。