【问题标题】:HTTP Session in Load Balancer负载均衡器中的 HTTP 会话
【发布时间】:2017-04-24 21:35:04
【问题描述】:

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

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

Language: Java 

Framework: Spring

Server: Jboss 7.1.1

【问题讨论】:

    标签: java spring jboss7.x httpsession


    【解决方案1】:

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

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

    或者,您可以将会话持久保存在外部数据源中,并在两个服务器之间共享,而无需粘性会话。 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/

    【讨论】:

    • 注意到无效会话仅在所选网络中发生。我们的应用程序可在印度各地的 21 家不同商店访问。其中 7 家门店存在此问题,甚至所有使用 Airtel 网络的门店。我们的应用程序在我的办公网络和 airtel 数据卡中运行良好。但是在我的笔记本电脑上使用 Jio 网络连接时遇到了奇怪的问题
    • 您使用的是什么负载均衡器?一些负载均衡器(如 NGINX)支持(并设置为默认)客户端 IP 地址的会话亲和性。如果是这种情况,当您从办公网络连接时,无论您从哪个工作站连接,服务器读取的客户端 IP 都可能相同,因为大多数办公网络使用代理处理出站流量。因此,服务器可能只会将代理的 IP 视为客户端 IP。这将在您使用不同的提供商后立即改变。猜测,但我们在从蜂窝数据与办公室 LAN/WAN 连接时遇到了类似的问题。
    • 我们使用“F5”负载均衡器,有时会话在 Jio 网络中进行身份验证后变得无效,但在 airtel 网络中工作正常,知道为什么会这样吗?如何解决这个问题,请帮忙。
    猜你喜欢
    • 2021-09-06
    • 2014-01-24
    • 1970-01-01
    • 2021-08-31
    • 2021-12-07
    • 2023-03-10
    • 2016-01-11
    • 2011-06-20
    • 2016-07-08
    相关资源
    最近更新 更多