Session一致性問題

2021-09-23 14:09:07 字數 1246 閱讀 3956

1、什麼是session

session在網路應用上表示「會話控制」,用於儲存特定使用者會話所需的屬性及配置資訊;session又表示乙個特定的時間間隔,指從登入進入系統到登出退出系統之間所經過的時間。 

http是無狀態的協議,在動態web應用中,往往需要知道前面的操作和後面的操作是不是乙個使用者。也就是業務是需要有關聯性的。 

結合session和瀏覽器cookie,將伺服器端session儲存到瀏覽器cookie中來保持http會話狀態。

2、什麼是session一致性問題

當乙個帶有會話標識的http請求到了web伺服器後,需要在http請求的處理過程中找到對應的會話資料(session),而問題在於,會話資料是需要儲存在單機上的。如上圖,當我第一次訪問伺服器的時候,請求落在左邊的伺服器上,那麼就會在左邊的伺服器上建立session,如果不做處理,那麼我們,每次訪問伺服器就不能保證每次請求都落在左邊的服務上,這就是session問題。

3、如何解決session問題

(1) 基於nginx的ip_hash策略來做負載均衡

a、原理:根據ip做hash計算,同乙個ip的請求始終定位到同一臺tomcat上。    

b、如在nginx.conf配置如下:  upstream sessiontest    

c、此種方案的好處:配置簡單,沒有侵入性;     d、壞處:單點故障,伺服器掛了,導致session丟失。

(2) 伺服器session的複製  

b、這種方案一般的容器都支援,但是這種方案本身有一些問題,在一定場合下問題很嚴重。 

c、同步session資料會造成網路頻寬的開銷,只要session資料有變化,就需要將資料同步到其他機器上,機器越多,同步帶來的網路頻寬開銷就越大; 每台機器都儲存所有機器的session,會占用記憶體。 所以這個方案不適合集群的場景下,如果只有幾台機器,用這個方案是可以的。

(3) session的集中管理

a、原理:session不由tomcat管理,而是統一放到乙個地方管理,讀取和寫入session都依賴第三方軟體,如redis,mysql,mongodb等。

b、一般redis使用的比較多,將session儲存到redis中,每次需要session的時候就可以到redis快取中取session資料。 

c、這種方案可以說是終極解決方案,一般分布式的環境下用的比較多。不過也有缺點,對**有侵入性,需要改配置,維護第三方庫。

併發一致性問題

常見併發併發一致性問題包括 丟失的修改 不可重複讀 讀髒資料 幻影讀 幻影讀在一些資料中往往與不可重複讀歸為一類 2.2.1.1 丟失修改 下面我們先來看乙個例子,說明併發操作帶來的資料的不一致性問題。考慮飛機訂票系統中的乙個活動序列 甲售票點 甲事務 讀出某航班的機票餘額a,設a 16.乙售票點 ...

分布式系統session一致性問題

伺服器為每個使用者建立乙個會話,儲存使用者的相關資訊,以便多次請求能夠定位到同乙個上下文。這樣,當使用者在應用程式的 web 頁之間跳轉時,儲存在 session 物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當使用者請求來自應用程式的 web 頁時,如果該使用者還沒有會話,則 web...

Redis Mysql 讀寫一致性問題

如果不能正確的處理 redis 和 mysql 的讀寫邏輯很容易出現髒讀,從而導致造成一些不必要的風險,如在插入資料時,先寫redis在寫db,如果失敗會回滾,此時redis的資料是無效的資料從而造成髒讀 在讀取資料時,我們遵守先從redis中讀取資料,如果redis不存在,再到db中去讀資料。在向...