當前位置 主頁 > 服務器問題 > win服務器問題匯總 > 最大化 縮小

    Session的一致性問題解決辦法

    欄目:win服務器問題匯總 時間:2018-08-27 17:11

      一、什么是Session?
     
     1、What:Session在網絡應用上表示“會話控制”,用于存儲特定用戶會話所需的屬性及配置信息;Session又表示一個特定的時間間隔,指從登錄進入系統到注銷退出系統之間所經過的時間。
     
     2、Why:http是無狀態的協議,在動態web應用中,往往需要知道前面的操作和后面的操作是不是一個用戶。也就是業務是需要有關聯性的。
     
     3、How:結合Session和瀏覽器Cookie,將服務器端Session保存到瀏覽器cookie中來保持http會話狀態。
     
      二、什么是Session一致性問題
     
     1、當一個帶有會話標識的HTTP請求到了Web服務器后,需要在HTTP請求的處理過程中找到對應的會話數據(Session),而問題在于,會話數據是需要保存在單機上的。如上圖,當我第一次訪問服務器的時候,請求落在左邊的服務器上,那么就會在左邊的服務器上創建Session,如果不做處理,那么我們,每次訪問服務器就不能保證每次請求都落在左邊的服務上,這就是Session問題。
     
      三、如何解決Session問題:
     
     1、第一種方案:基于nginx的ip_hash策略來做負載均衡
     
     a、原理:根據ip做hash計算,同一個ip的請求始終定位到同一臺tomcat上。
     
     b、如在nginx.conf配置如下:
     
      upstreamsessionTest{
     
      ip_hash;
     
      server192.168.11.1308080;
     
      server192.168.11.1308081;
     
      }
     
     c、此種方案的好處:配置簡單,沒有侵入性;
     
     d、壞處:單點故障,服務器掛了,導致Session丟失。
     
     2、第二種方案:服務器Session的復制
     
     a、原理:Tomcat服務器創建Session后,會通過組播方式把Session發送到組播地址中的其他服務器上。
     
     b、這種方案一般的容器都支持,但是這種方案本身有一些問題,在一定場合下問題很嚴重。
     
     c、同步Session數據會造成網絡帶寬的開銷,只要Session數據有變化,就需要將數據同步到其他機器上,機器越多,同步帶來的網絡帶寬開銷就越大;每臺機器都保存所有機器的Session,會占用內存。所以這個方案不適合集群的場景下,如果只有幾臺機器,用這個方案是可以的。
     
     3、第三種方案:Session的集中管理
     
     a、原理:Session不由Tomcat管理,而是統一放到一個地方管理,讀取和寫入Session都依賴第三方軟件,如redis,mysql,mongodb等。
     
     b、一般redis使用的比較多,將Session保存到redis中,每次需要Session的時候就可以到redis緩存中取Session數據。
     
     c、這種方案可以說是終極解決方案,一般分布式的環境下用的比較多。不過也有缺點,對代碼有侵入性,需要改配置,維護第三方庫。
教我怎样炒股