在集群中部署多個服務器如何解決SESSION問題?

餘堅銳


首先我們來分析這個問題,問題裡出現了兩個關鍵詞:集群、Session,在回答問題之前我們先來聊聊這兩個關鍵詞。

集群

說到集群首先給人的第一感覺是一大堆的服務器,其實這種想法是片面的,集群是指多臺服務器上部署同一個業務,通俗說就是同一件事多個人來幹。談到集群就不得不說分佈式。分佈式是為了解決業務的高耦合性產生,將一個寵大的任務拆分成多個子任務部署在不同服務器上,這就是分佈式。

Session

由於HTTP協議是無狀態的,瀏覽器的每一次訪問對於服務器來說都是第一次訪問,服務器就好像得了阿茲海默症(健忘症)。為了解決這個問題,Cookie和Session兩兄弟應運而生。

用戶訪問Web服務器後,服務器生成了Session並將唯一標識符(SessionID)存放在客戶端Cookie中,下次瀏覽器發出請求就會攜帶Cookie,服務器根據Cookie中的SessionID就去找對應的Session,找到了則代表會話成功。

集群部署時Session會出什麼問題?

因為Session默認是存儲在服務器端的,而集群部署時用戶的請求可能會被定向至不同的節點服務器上,所以可能第一次訪問時保存了會話狀態,第二次訪問又被定向到其它節點(其它節點上並沒有此用戶的Session信息)上導致會話狀態丟失!

如何解決集群環境下的Session同步問題?

解決這個問題,我們只要確保所有節點服務器共用Session即可,方案有以下幾種供大家選擇:

1、粘性Session

同一個用戶的請求分配到同一臺服務器(通過一致性HASH算法實現),這樣始終在這臺服務器上尋找Session,稱為粘性Session。

2、Session複製

將所有節點服務器上的Session保持同步複製狀態,任何一臺節點上產生新的Session都複製到其它節點服務器。

3、Session共享

將Session放在統一的地方集中管理(如:Session入庫、存入Redis等),然後所有節點服務器統統從這個地方存取Session即可。


以上這幾種解決方案應用最廣的就是Session共享機制,既可解決Session同步問題又無需擔心數據丟失。

以上就是我的觀點,對於這個問題大家是怎麼看待的呢?歡迎在下方評論區交流 ~ 我是科技領域創作者,十年互聯網從業經驗,歡迎關注我瞭解更多科技知識!

網絡圈


我是一個有10年項目架構經驗的java軟件工程師,歡迎關注我,瞭解更多java前沿技術!目前一般都是使用redis共享session解決這個問題。


分享到:


相關文章: