如何在分布式应用程序中管理会话

How to manage sessions in a distributed application

我有一个 Java Web 应用程序部署在两个虚拟机上。并且为这些 VM 设置了 NLB(网络负载平衡)。我的应用程序使用会话。我很困惑如何在两个虚拟机中管理用户会话。例如,如果我向 VM1 发出请求并创建用户会话。现在我第二次发出请求,它转到 VM2 并想要访问会话数据。它如何找到在 VM1 中创建的会话。

请帮我解决这个困惑。

有几种解决方法:

  • 将负载均衡器配置为粘性的:即属于同一会话的请求将始终转到同一虚拟机。优点是这个解决方案很简单。缺点是如果一个虚拟机失败,一半的用户会失去他们的会话
  • 将服务器配置为使用持久会话。如果会话保存到中央数据库并从该中央数据库加载,那么两个虚拟机将在会话中看到相同的数据。您可能仍然希望有粘性会话以避免同时访问同一会话
  • 配置集群中的服务器,distribute/replicate集群所有节点上的会话
  • 避免使用会话,仅使用签名的 cookie 来识别用户(并且可能包含一些附加信息)。 JSON 网络令牌可能是一个很好的解决方案。在需要时从数据库中获取其他所有内容。这确保了可伸缩性和故障转移,而且,IMO,通常使服务器上的事情变得更简单,而不是让它变得更复杂。

您必须查看服务器的文档以了解该服务器的功能,或者使用第三方解决方案。

我们可以使用分布式Redis来存储session,可以解决这个问题。