Load Balancer中的HTTP会话

时间:2016-12-09 11:51:57

标签: java spring jboss7.x httpsession

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

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

Language: Java 

Framework: Spring

Server: Jboss 7.1.1

1 个答案:

答案 0 :(得分:9)

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

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

或者,您可以将会话保留在外部数据源中,并在两个服务器之间共享,而无需粘性会话。 Spring Session框架提供了一种使用许多外部数据源实现会话持久性的非常方便的方法。会话持久性需要代码(好的,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/