负载均衡器中的 HTTP 会话

HTTP Session in Load Balancer

我们有两台服务器用于负载平衡。有时我们在成功登录到我们的应用程序后会收到无效会话,并且即使会话超时配置为 30 分钟,用户会话也会过期。我们不确定身份验证是否在其中一台服务器中进行,后续请求是否转到另一台服务器。这似乎是随机的,并非所有用户都会发生。

注意到仅在所选网络中发生无效会话。我们的应用程序可在印度 21 家不同的商店访问。其中有7家店有这个问题,甚至所有使用Airtel网络的店。我们的应用程序在我的办公室网络和 airtel 数据卡中运行良好。但是在我的笔记本电脑上使用 Jio 网络连接时遇到奇怪的问题。这如何仅在 Jio 网络中发生?

Language: Java 

Framework: Spring

Server: Jboss 7.1.1

正如您所说,问题很可能是因为会话是在一台服务器上创建的,但是一些后续请求将转到另一台没有正确会话属性的服务器,因此它认为用户未登录。

您要么需要在负载均衡器中配置粘性会话,以便对给定会话的所有请求始终重定向到会话存在的两个服务器之一(并坚持下去)。换句话说,一旦在 serverA 上创建了 user1 的会话,所有后续请求都会针对该会话坚持使用它。同样,用户 2 的会话可能会也可能不会在同一服务器或服务器 B 上结束。粘性会话(或会话亲和力)可以仅通过配置而无需更改代码来实现。

或者,您可以将会话保存在外部数据源中,并在两个服务器之间共享它,而无需粘性会话。 Spring 会话框架提供了一种非常方便的方法来使用许多外部数据源实现会话持久化。持久会话需要更改代码(好吧,Spring 配置),因此它们比使用粘性会话更具侵入性,但它更适合服务的负载平衡、可扩展性和可用性。

以下是一些可以帮助您做出决定或至少了解更多信息的参考资料:

http://blog.haproxy.com/2012/03/29/load-balancing-affinity-persistence-sticky-sessions-what-you-need-to-know/

https://touk.pl/blog/2016/03/22/haproxy-sticky-sessions-for-soap-payloads/

http://docs.spring.io/spring-session/docs/current/reference/html5/