分布式Session
更新時間 2023-12-20 10:42:17
最近更新時間: 2023-12-20 10:42:17
分享文章
業務背景
在web應用中,為了應對大規模訪問,必須實現應用的集群部署.要實現集群部署主要需要實現session共享機制,使得多臺應用服務器之間會話統一,weblogic tomcat等多數主流web服務器都采用了session復制以及實現session的共享. 但問題是很明顯的:在節點持續增多的情況下,session復制帶來的性能損失會快速增加。特別是當session中保存了較大的對象,而且對象變化較快時,性能下降更加顯著。這種特性使得web應用的水平擴展受到了限制。session共享的另一種思路就是把session集中起來管理,首先想到的是采用數據庫來集中存儲session,但數據庫是文件存儲相對內存慢了一個數量級,同時這勢必加大數據庫庫系統的負擔。并且session里面的數據結構是MAP類型,和分布式緩存的MAP數據結構天然匹配。
業務要求
- 良好的擴展性,100個節點以上web服務器;
- Session操作的性能能橫向擴展,容量橫向擴展;
- 共享session數據支持超時機制
需求分析
天翼云分布式緩存單分組支持1000個web服務器*100個線程以上的連接池連接、后端redis存儲節點支持1000個redis節點水平擴展,存儲容量最大可支持500TB、支持按key設置超時時間
實現思路:通用實現思路,與web容器選型無關
- 使用filter攔截cookie中的sessionId,通過sessionId構造新的HttpServletRequestWrapper對象,傳給后面的應用;
- 繼承重構HttpServletRequestWrapper,HttpSessionWrapper類,覆蓋原來和session存取相關的方法,都通過SessionService類來實現;
- 使用HttpSessionSidWrapper實現httpsession接口,對容器的session的屬性存取操作進行包裝;
- Session對象 map<String,object>,緩存中是 map<String,byte[]>,需要把session中的object序列化成byte[] 。