1、什么是session,什么是session一致性
什么是session?
服務器會為每個用戶創建一個會話,存儲用戶的相關信息,以便多次請求,能夠定位到同一個上下文中,在web開發中,web-server可用自動的為同一個瀏覽器的訪問用戶,自動創建session,提供數據存儲功能,最常見的會把用戶的登錄信息,用戶信息存儲在session中,以保持登錄狀態。
什么session一致性問題?
只要用戶不重啟瀏覽器,每次http短連接請求,理論上服務端都能定位到session,都能夠定位到同一臺web-server,以保持會話,這就是所謂的session一致性問題
2、解決session一致性問題,有哪些方案?
方案1: session同步法
思路: 站點集群session同步

多個web-server之間相互同步session,這樣每個web-server之間都包含全部的session
優點: web-server的功能,應用程序不需要修改任何代碼
缺點: session同步需要數據傳輸,需要占大量的帶寬,每臺web-server需要維護的session會很多,數據量受內存限制,沒辦法進行水平擴展,當有多臺web-server,性能下降
方案2: 客戶端存儲法
思路: session存儲在客戶端
缺點: 每次http請求都需要攜帶session,非常占用外網的帶寬,數據存儲在端上,并在網絡上進行傳輸,存在泄密、篡改、竊取等安全隱患,存儲量的大小會受到端上cookie的限制
方案3: 反向代理hash一致性(四層、七層)
思路: 反向代理路由保障

四層: ip hash
七層: 根據某些head屬性,比如session_ip或用戶id做hash
優點: 只需要修改nginx的配置,不需要修改業務代碼,可用水平擴展
缺點: 如果web-server重啟,有部分用戶會受影響,需要重新登錄,如果webserver水平擴展,那么nginx會重新hash,session會重新分布,也會導致一部分用戶路由不到正確的session
方案4: 后端統一存儲法
思路: 不存儲在站點,統一存儲在后端(數據庫、緩存)
將session存儲在web-server后端的存儲層,數據庫或者緩存,如圖

優點: 沒有安全隱患,session不用在外網上進行傳輸,可用實現web層的任意水平擴展
缺點: 增加了一次網絡調用,需要修改應用程序的代碼,需要應用代碼管理session
建議使用高可用的緩存(比如redis)
總結: 推薦使用方案4,使用緩存統一存儲session