分布式session共享

2022-06-18 22:36:13 字數 1422 閱讀 9371

什麼是session:

伺服器為每個使用者建立乙個會話,儲存使用者的相關資訊,以便多次請求能夠定位到同乙個上下文。

當使用者請求來自應用程式的 web 頁時,如果該使用者還沒有會話,則 web 伺服器將自動建立乙個 session 物件。當會話過期或被放棄後,伺服器將終止該會話並銷毀。

分布式session:

以往單伺服器的專案,我們不需要考慮session共享問題,因為session也在該伺服器中。

現在隨著網際網路的發展,使用者數量激增,單伺服器已經無法滿足;集群方式部署伺服器已經在很多公司執行起來,當高併發量的請求到達服務端的時候通過負載均衡的方式分發到集群中的某個伺服器,這樣就有可能導致同乙個使用者的多次請求被分發到集群的不同伺服器上,就會出現取不到session資料的情況,於是session的共享就成了乙個問題。

第一種方案:

部署專門管理session的伺服器來管理session;當其他伺服器讀取session的時候都需要去訪問session伺服器。

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

有狀態的session伺服器,一種比較簡單的方法是利用分布式快取(redis、memcached), 或者儲存在資料庫(如mysql)等。在這些產品的基礎上進行包裝,使其符合session的儲存和訪問要求。

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

優點:可靠性比較好

缺點:實現比較複雜、穩定性依賴於快取的穩定性、session資訊放入快取時要有合理的策略寫入。

session伺服器使用場景:集群中機器數多、網路環境複雜。

第二種方案:

cookie管理session;

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

缺點:受cookie大小的限制,能記錄的資訊有限; 

每次請求響應都需要傳遞cookie,影響效能;

如果使用者關閉cookie,訪問就不正常。

優點:cookie的簡單易用,可用性高,支援應用伺服器的線性伸縮。

第三種方案:

ession繫結;

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

session繫結使用場景:機器數適中、對穩定性要求不是非常苛刻

優點:實現簡單、配置方便、沒有額外網路開銷

缺點:網路中有機器down掉時、使用者session會丟失、容易造成單點故障。

第四種方案:

使用token代替session,現在很多企業都使用這種方式解決分布式session共享問題。

**自:

分布式session共享

為什麼會出現session共享問題?客戶端與伺服器互動時會產生唯一的sessionid用於標記使用者,但是在分布式架構中,如果還是採用 session 的方式,使用者發起請求,通過 nginx 做請求 時,並不知道是 到伺服器1還是伺服器2,所以就會出現session共享問題。今天主要記錄使用 sp...

shiro分布式session共享

使用nginx tomcat進行負載均衡時,希望使用輪詢方式進行負載。但是如果使用輪詢方式的話,可能會訪問不同的tomcat,此時如果不進行session共享,則相當於是乙個新的session。就比如現有系統都是需要認證登入的系統,如果沒有session共享,則會導致使用者退出登入。當我們使用了ng...

分布式如何實現session共享

我們實現的方案可以說是第二種方案和第三種方案的合體,可以利用gemfire實現session複製共享,還可以將session維護在redis中實現session共享,同時可以將session維護在客戶端的cookie中,但是前提是資料要加密。這三種方式可以迅速切換,而不影響應用正常執行。我們在實踐中...