今天就跟大家聊聊有關ASP.NET Core中怎么解決分布式Session一致性問題,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)公司服務項目包括青田網(wǎng)站建設、青田網(wǎng)站制作、青田網(wǎng)頁制作以及青田網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,青田網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到青田省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
一、我們知道Session的常見形式是會話cookie,即為設置過期時間的cookie,它的默認的生命周期為瀏覽器會話期間,一旦瀏覽器關閉窗口,這個cookie就消失了。其實現(xiàn)機制為:當用戶發(fā)起一個請求的時候,服務器會檢查該請求中是否包含sessionID,如果不包含,則服務器會生成一個名為JSESSIONID的cookie返回到瀏覽器,(這個cookie存放在內(nèi)存中,并不會存在硬盤)。同時在服務器端以HashTable的形式寫到服務器內(nèi)存中;當請求中包含sessionID時,服務器端會在HashTable中查找與該session相匹配的信息,若存在則直接使用該sessionID,否則重新生成新的session。
二、 Session共享:如果網(wǎng)站是存放在一臺機器上,是不存在session共享這個問題的,因為所有的會話數(shù)據(jù)都在這一臺機器上。但是,現(xiàn)在的網(wǎng)站大部分都是需要做負載均衡的,即需要把用戶的請求分發(fā)到不同機器,當然這時會話ID在客戶端是不存在問題的,但是服務端會出現(xiàn)取不到session數(shù)據(jù)的情況。如下圖:
在該架構中,采用Nginx做負載均衡,兩個Tomcat做后端服務器,假設當客戶端第一次請求時,Nginx將其分發(fā)到了Tomcat1,這時候Tomcat1會產(chǎn)生sessionID返回給客戶端,并同時保存在自己的內(nèi)存中;當客戶端第二次請求時,Nginx將其分發(fā)到了Tomcat2,這時便無法取到session。從而就會重新生成session,返回給客戶端,并保存在自己的內(nèi)存中。兩臺Tomcat中保存的同一個用戶的session不同,這便是session的一致性問題。
為了解決這個問題,首當其沖,我會想到,將Tomcat1中的session復制到Tomcat2中即可,當然是可以的,但是不方便,因為這里只有兩臺服務器,而當后臺服務器增多時,會很麻煩。從而,便有了如下的解決方法:
即,將session分離出來,每個服務器都是從該session服務器(集群)中獲取。這樣以來,新增加的服務器也只需從session集群中獲取。
(session集群可以通過memcached或redis來實現(xiàn))
三、那么我們來看看ASP.NET Core使用Redis存儲Session實現(xiàn)分布式共享?
Session 是客戶端與服務器通訊會話跟蹤技術,服務器與客戶端保持整個通訊的會話基本信息??蛻舳嗽诘谝淮卧L問服務端的時候,服務端會響應一個sessionId并且將它存入到本地cookie中,在之后的訪問會將cookie中的sessionId放入到請求頭中去訪問服務器,如果通過這個sessionid沒有找到對應的數(shù)據(jù)那么服務器會創(chuàng)建一個新的sessionid并且響應給客戶端。
1、為什么要分布式共享Session?
單服務器web應用中,session信息只需存在該服務器中,這是我們前幾年最常接觸的方式,但是近幾年隨著分布式系統(tǒng)的流行,單系統(tǒng)已經(jīng)不能滿足日益增長的百萬級用戶的需求,集群方式部署服務器已在很多公司運用起來,當高并發(fā)量的請求到達服務端的時候通過負載均衡的方式分發(fā)到集群中的某個服務器,這樣就有可能導致同一個用戶的多次請求被分發(fā)到集群的不同服務器上,就會出現(xiàn)取不到session數(shù)據(jù)的情況,于是session的共享就成了一個問題。這個時候就需要解決Session一致性。
2、分布式Session存在的問題?
假設第一次訪問服務A生成一個sessionid并且存入cookie中,第二次卻訪問服務B客戶端會在cookie中讀取sessionid加入到請求頭中,如果在服務B通過sessionid沒有找到對應的數(shù)據(jù)那么它創(chuàng)建一個新的并且將sessionid返回給客戶端,這樣并不能共享我們的Session無法達到我們想要的目的。說白了一句話就是: 分布式Session存在會話不一致性的問題。
3、分布式Session解決方案有哪些?
實現(xiàn)分布式session的方案非常多,選型時需要一種可靠、簡單的實現(xiàn)方式,結合我們項目中的使用經(jīng)驗來看,使用基于Redis實現(xiàn)的分布式session方案還是比較靠譜的。
看完上述內(nèi)容,你們對ASP.NET Core中怎么解決分布式Session一致性問題有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
本文標題:ASP.NETCore中怎么解決分布式Session一致性問題
轉載源于:http://m.rwnh.cn/article2/ipjgoc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設計、軟件開發(fā)、定制網(wǎng)站、網(wǎng)站內(nèi)鏈、標簽優(yōu)化、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)