2016-12-09 76 views
4

我們有兩臺服務器用於負載均衡。有時我們在成功登錄到應用程序後會遇到無效會話,並且即使會話超時配置爲30分鐘,用戶會話也已過期。我們不確定身份驗證是否發生在其中一臺服務器上,並且後續請求會發送到另一臺服務器。這似乎是隨機的,並不會發生在所有用戶身上。負載均衡器中的HTTP會話

注意到僅在所選網絡中發生的無效會話。我們的應用程序可以在印度的21個不同的商店中使用其中7家商店有這個問題,甚至所有使用Airtel網絡的商店。我們的應用程序在我的辦公網絡和Airtel數據卡上運行良好。但在我的筆記本電腦上使用Jio網絡連接時遇到奇怪的問題。單獨在Jio網絡中如何發生這種情況?

Language: Java 

Framework: Spring

Server: Jboss 7.1.1 

回答

6

正如你所說的,這個問題很可能是因爲該會話在一臺服務器上創建的,但一些後續請求會到另一臺服務器,不正確的屬性,因此它認爲用戶未登錄。

您可能需要在負載平衡器中配置粘滯會話,以便給定會話的所有請求總是重定向到會話所在的兩個服務器之一存在(並堅持下去)。換句話說,一旦在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/

+0

注意的無效會話只選定網絡中發生的事情。我們的應用程序可以在印度的21個不同的商店中使用其中7家商店有這個問題,甚至所有使用Airtel網絡的商店。我們的應用程序在我的辦公網絡和Airtel數據卡上運行良好。但在我的筆記本電腦上使用Jio網絡連接時遇到奇怪的問題 –

+0

您使用的是什麼負載平衡器?某些負載均衡器(如NGINX)支持(並將其設置爲默認值)會話相關性由客戶端IP地址。如果是這種情況,當您從辦公室網絡進行連接時,無論您連接哪個工作站,服務器讀取的客戶端IP都是相同的,因爲大多數辦公網絡都使用代理來實現出站通信。因此,服務器可能只會將代理的IP視爲客戶端IP。只要您使用不同的提供商,這一點就會改變。猜測,但是我們在從蜂窩數據連接到辦公室局域網/廣域網時遇到了類似的問題。 – Bloodysock

+0

我們使用「F5」負載均衡器,有時會話在Jio網絡中認證後失效,但在Airtel網絡中工作正常,爲什麼它會發生?如何解決這個問題,請幫助。 –