當前位置:
首頁 > 最新 > 一文讀懂分散式Session常見解決方案

一文讀懂分散式Session常見解決方案

前言

沉思君在之前的文章《談談HTTP狀態保持》里介紹了有關HTTP狀態保持的知識點,我們知道HTTP協議本身是無狀態的,因此在使用HTTP協議進行通信的過程中,需要藉助Session機制進行狀態的保持。然而在大型網站中,我們的伺服器數量通常不止一台,可能是幾十台甚至幾百台之多,用戶發起的HTTP請求通常要經過像Ngnix之類的負載均衡器之後,再路由到具體的伺服器上,由於Session默認是存儲在單機伺服器內存中的,因此在分散式環境下同一個用戶發送的多次HTTP請求可能會先後落到不同的伺服器上,導致後面發起的HTTP請求無法拿到之前的HTTP請求存儲在伺服器中的Session數據,從而使得Session機制在分散式環境下失效。

因此在分散式環境下,要使用Session機制進行狀態保持,需要採取額外的手段,在這裡介紹常見的4種解決方案:Session集中式存儲、Session複製、Session Sticky、Cookie Based。

Session集中式存儲

Session集中式存儲是指將原先存儲在單機伺服器內存中的Session數據集中存儲起來,比如說存儲在分散式緩存Redis集群中。其原理是以SessionId作為Key,序列化後的HttpSession對象作為Value存儲在Redis中,然後將SessionId返回給客戶端,當下一次客戶端發送HTTP請求到伺服器的時候,會帶上這個SessionId,伺服器再根據SessionId從Redis拿到相應的Session數據並反序列化成HttpSession對象。由於對HttpSession對象進行了集中存儲,而不是存儲在伺服器本地內存,所以即使同個用戶的多次HTTP請求落到不同的伺服器上,也能將SessionId與相應的HttpSession對象關聯起來,從而實現分散式環境下的Session共享。那麼問題來了,這種解決方案有什麼優缺點呢?歡迎在評論區留下你的答案。

Session複製

Session複製從另一個角度解決分散式Session問題。前文說到,Session機制在分散式環境下失效的原因是每台伺服器上只存儲了部分客戶端的Session信息,那麼我們只要保證每台伺服器上都存儲了所有客戶端的Session信息不就解決問題了嗎?Session複製就是基於這個思路實現的,當客戶端在某台伺服器上存儲了Session數據的時候,我們可以手動地將該Session信息同步到集群中的其他伺服器上面去,這樣一來所有伺服器就都存儲了所有客戶端的Session信息了,因此即使同個客戶端的多次HTTP請求落到不同的伺服器上面去,也還是能夠拿到相應的Session信息,故而也解決了Session分散式問題。實際上,一些開源的Web容器可以支持Session複製,如:Tomcat,因此實施起來難度不大。同樣地,這種解決方案也是有利弊的,可以在評論區留下你的答案。

Session Sticky

從另一個角度來說,分散式環境下Session失效也可以說是因為同個客戶端在多次請求之間落到不同的伺服器上導致的。因此,如果能夠保證同個客戶端發起的HTTP請求都由相同的伺服器進行處理,那麼也可以避免Session失效的問題。比如說,Nginx有一種稱為IP Hash的負載均衡策略,其可以實現相同IP發送的HTTP請求都路由到同一台伺服器上面去,故而也能解決Session分散式問題。同樣地,在評論區討論這種方案的利弊吧。

Cookie Based

前面所講的方案都是將Session數據存儲在伺服器中,其實要實現會話保持,還可以將Session數據存儲在客戶端,常見的方案是存儲在Cookie中,這樣一來伺服器就無需維護客戶端的狀態,即伺服器「無狀態化」,無狀態化的好處是利於伺服器水平擴展。比如:JWT就是基於Cookie實現用戶認證功能的,有興趣的朋友可以去了解下。那麼這種方案有何優缺點呢?評論區見。

總結

關於Session分散式處理的解決方案,沉思君之前也踩過很多坑,直到看了圖靈學院的免費教學視頻才豁然開朗。這不,沉思君要到了圖靈學院助教老師的微信號,在此分享給各位,加助教老師的微信,可以免費獲取Java高級架構師教學視頻,你還在等什麼,動動手指頭領取下方資料大禮包,走上人生巔峰指日可待

資料大禮包

長按識別下方二維碼領取學習資料

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 編程沉思錄 的精彩文章:

TAG:編程沉思錄 |