一、引言
1.什么是session
Session 是服務器用來保存用戶操作的一系列會話信息,由Web容器進行管理。最常見的,會把用戶的登錄信息、用戶信息存儲在 session 中,以保持登錄狀態。
2.session的創建
在會話開始時,分配一個唯一的會話標識 SessionID(sessionid 是一個會話的key,瀏覽器第一次訪問服務器會在服務器端生成一個 session,
有一個 sessionId 和它對應。),並通過 Cookie 將這個標識告訴瀏覽器(客戶端會將 sessionID 保存在 cookie 中。),
以后每次請求的時候,瀏覽器都會帶上這個會話標識SessionID來告訴Web服務器這個請求是屬於哪個會話的。
在Web服務器上,各個會話都有獨立的存儲,保存不同會話的信息。如果遇到禁用Cookie的情況,
一般的做法就是把這個會話標識放到URL的參數中。
3.session共享
分布式情況下,如果每台服務器都session存在自己的內存中,不同服務器之間就會造成數據不一致問題,
這時候就需要session共享。單機情況下,不存在Session共享的情況。分布式情況下,
如果不進行Session共享會出現數據不一致,比如:會導致請求落到不同服務器要重復登錄的情況。
二、解決方案
1.session復制
應用服務器開啟web容器的session復制功能,在集群中的幾台服務器之間同步session對象,
多個web-server之間相互同步session,這樣每個web-server之間都包含全部的session。
不足:
-
session的同步需要數據傳輸,占內網帶寬,有時延
-
有更多web-server時,容易造成網絡風暴

2. 客戶端存儲
將session存儲到瀏覽器cookie中。每次請求服務器的時候,將session放在請求中發送給服務器,服務器處理完請求后再將修改后的session響應給客戶端。
缺點:
-
數據存儲在端上,並在網絡傳輸,存在泄漏、篡改、竊取等安全隱患
-
session存儲的數據大小受cookie限制

3. 反向代理hash一致性
反向代理層使用用戶ip來做hash,以保證同一個ip的請求落在同一個web-server上
不足:
-
如果web-server重啟,一部分session會丟失,產生業務影響,例如部分用戶重新登錄
-
如果web-server水平擴展,rehash后session重新分布,也會有一部分用戶路由不到正確的session
4. 后端統一集中存儲
將session存儲在web-server后端的存儲層,數據庫或者緩存,一般用redis/memchache緩存。

