分佈式Session共享解決方案

java那些事2019-01-11 20:53:28

Session是服務器用來保存用戶操作的一系列會話信息,由Web容器進行管理。單機情況下,不存在Session共享的情況,分佈式情況下,如果不進行Session共享會出現請求落到不同機器要重複登錄的情況,一般來說解決Session共享有以下幾種方案。

1、session複製

session複製是早期的企業級的使用比較多的一種服務器集群session管理機制。應用服務器開啟web容器的session複製功能,在集群中的幾臺服務器之間同步session對象,使得每臺服務器上都保存所有的session信息,這樣任何一臺宕機都不會導致session的數據丟失,服務器使用session時,直接從本地獲取。

這種方式在應用集群達到數千臺的時候,就會出現瓶頸,每臺都需要備份session,出現內存不夠用的情況。

2、session綁定

利用hash算法,比如nginx的ip_hash,使得同一個Ip的請求分發到同一臺服務器上。

這種方式不符合對系統的高可用要求,因為一旦某臺服務器宕機,那麼該機器上的session也就不復存在了,用戶請求切換到其他機器後麼有session,無法完成業務處理。

3、利用cookie記錄session

session記錄在客戶端,每次請求服務器的時候,將session放在請求中發送給服務器,服務器處理完請求後再將修改後的session響應給客戶端。這裡的客戶端就是cookie。

利用cookie記錄session的也有缺點,比如受cookie大小的限制,能記錄的信息有限;每次請求響應都需要傳遞cookie,影響性能,如果用戶關閉cookie,訪問就不正常。但是由於

cookie的簡單易用,可用性高,支持應用服務器的線性伸縮,而大部分要記錄的session信息比較小,因此事實上,許多網站或多或少的在使用cookie記錄session。

4、session服務器

session服務器可以解決上面的所有的問題,利用獨立部署的session服務器(集群)統一管理session,服務器每次讀寫session時,都訪問session服務器。

這種解決方案事實上是應用服務器的狀態分離,分為無狀態的應用服務器和有狀態的session服務器,然後針對這兩種服務器的不同特性分別設計架構。

對於有狀態的session服務器,一種比較簡單的方法是利用分佈式緩存(memcached), 數據庫等。在這些產品的基礎上進行包裝,使其符合session的存儲和訪問要求。

如果業務場景對session管理有比較高的要求,比如利用session服務基層單點登錄(sso),用戶服務器等功能,需要開發專門的session服務管理平臺。

以上部分內容摘自《大型網站技術架構:核心原理與案例分析》一書,獲取該書高清電子版,及更多架構技術書籍,可在公眾號菜單中回覆"微信群",在對應的群文件中進行獲取。

近期精選


分佈式架構設計免費福利

Dubbo分佈式系列高級視頻教程。

Hadoop全套視頻教程

阿里高級Java面試題(首發,70道,帶詳細答案)

2017派臥底去阿里、京東、美團、滴滴帶回來的面試題及答案

Spring面試題(70道,史上最全)



  Java技術棧  
微信公眾號:「Javastack

分享Java乾貨,高併發編程,熱門技術教程,微服務及分佈式技術,架構設計,區塊鏈技術,人工智能,大數據,Java面試題,以及前沿熱門資訊等。

 ▼長按二維碼關注我們↓↓↓


https://weiwenku.net/d/109858430