ASP.NETCore中怎么解決分布式Session一致性問(wèn)題

今天就跟大家聊聊有關(guān)ASP.NET Core中怎么解決分布式Session一致性問(wèn)題,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括青田網(wǎng)站建設(shè)、青田網(wǎng)站制作、青田網(wǎng)頁(yè)制作以及青田網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,青田網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到青田省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!

一、我們知道Session的常見(jiàn)形式是會(huì)話(huà)cookie,即為設(shè)置過(guò)期時(shí)間的cookie,它的默認(rèn)的生命周期為瀏覽器會(huì)話(huà)期間,一旦瀏覽器關(guān)閉窗口,這個(gè)cookie就消失了。其實(shí)現(xiàn)機(jī)制為:當(dāng)用戶(hù)發(fā)起一個(gè)請(qǐng)求的時(shí)候,服務(wù)器會(huì)檢查該請(qǐng)求中是否包含sessionID,如果不包含,則服務(wù)器會(huì)生成一個(gè)名為JSESSIONID的cookie返回到瀏覽器,(這個(gè)cookie存放在內(nèi)存中,并不會(huì)存在硬盤(pán))。同時(shí)在服務(wù)器端以HashTable的形式寫(xiě)到服務(wù)器內(nèi)存中;當(dāng)請(qǐng)求中包含sessionID時(shí),服務(wù)器端會(huì)在HashTable中查找與該session相匹配的信息,若存在則直接使用該sessionID,否則重新生成新的session。

二、 Session共享:如果網(wǎng)站是存放在一臺(tái)機(jī)器上,是不存在session共享這個(gè)問(wèn)題的,因?yàn)樗械臅?huì)話(huà)數(shù)據(jù)都在這一臺(tái)機(jī)器上。但是,現(xiàn)在的網(wǎng)站大部分都是需要做負(fù)載均衡的,即需要把用戶(hù)的請(qǐng)求分發(fā)到不同機(jī)器,當(dāng)然這時(shí)會(huì)話(huà)ID在客戶(hù)端是不存在問(wèn)題的,但是服務(wù)端會(huì)出現(xiàn)取不到session數(shù)據(jù)的情況。如下圖:

ASP.NET Core中怎么解決分布式Session一致性問(wèn)題

在該架構(gòu)中,采用Nginx做負(fù)載均衡,兩個(gè)Tomcat做后端服務(wù)器,假設(shè)當(dāng)客戶(hù)端第一次請(qǐng)求時(shí),Nginx將其分發(fā)到了Tomcat1,這時(shí)候Tomcat1會(huì)產(chǎn)生sessionID返回給客戶(hù)端,并同時(shí)保存在自己的內(nèi)存中;當(dāng)客戶(hù)端第二次請(qǐng)求時(shí),Nginx將其分發(fā)到了Tomcat2,這時(shí)便無(wú)法取到session。從而就會(huì)重新生成session,返回給客戶(hù)端,并保存在自己的內(nèi)存中。兩臺(tái)Tomcat中保存的同一個(gè)用戶(hù)的session不同,這便是session的一致性問(wèn)題。

為了解決這個(gè)問(wèn)題,首當(dāng)其沖,我會(huì)想到,將Tomcat1中的session復(fù)制到Tomcat2中即可,當(dāng)然是可以的,但是不方便,因?yàn)檫@里只有兩臺(tái)服務(wù)器,而當(dāng)后臺(tái)服務(wù)器增多時(shí),會(huì)很麻煩。從而,便有了如下的解決方法:

ASP.NET Core中怎么解決分布式Session一致性問(wèn)題

即,將session分離出來(lái),每個(gè)服務(wù)器都是從該session服務(wù)器(集群)中獲取。這樣以來(lái),新增加的服務(wù)器也只需從session集群中獲取。

(session集群可以通過(guò)memcached或redis來(lái)實(shí)現(xiàn))

三、那么我們來(lái)看看ASP.NET Core使用Redis存儲(chǔ)Session實(shí)現(xiàn)分布式共享?

Session 是客戶(hù)端與服務(wù)器通訊會(huì)話(huà)跟蹤技術(shù),服務(wù)器與客戶(hù)端保持整個(gè)通訊的會(huì)話(huà)基本信息??蛻?hù)端在第一次訪問(wèn)服務(wù)端的時(shí)候,服務(wù)端會(huì)響應(yīng)一個(gè)sessionId并且將它存入到本地cookie中,在之后的訪問(wèn)會(huì)將cookie中的sessionId放入到請(qǐng)求頭中去訪問(wèn)服務(wù)器,如果通過(guò)這個(gè)sessionid沒(méi)有找到對(duì)應(yīng)的數(shù)據(jù)那么服務(wù)器會(huì)創(chuàng)建一個(gè)新的sessionid并且響應(yīng)給客戶(hù)端。

1、為什么要分布式共享Session? 

單服務(wù)器web應(yīng)用中,session信息只需存在該服務(wù)器中,這是我們前幾年最常接觸的方式,但是近幾年隨著分布式系統(tǒng)的流行,單系統(tǒng)已經(jīng)不能滿(mǎn)足日益增長(zhǎng)的百萬(wàn)級(jí)用戶(hù)的需求,集群方式部署服務(wù)器已在很多公司運(yùn)用起來(lái),當(dāng)高并發(fā)量的請(qǐng)求到達(dá)服務(wù)端的時(shí)候通過(guò)負(fù)載均衡的方式分發(fā)到集群中的某個(gè)服務(wù)器,這樣就有可能導(dǎo)致同一個(gè)用戶(hù)的多次請(qǐng)求被分發(fā)到集群的不同服務(wù)器上,就會(huì)出現(xiàn)取不到session數(shù)據(jù)的情況,于是session的共享就成了一個(gè)問(wèn)題。這個(gè)時(shí)候就需要解決Session一致性。

2、分布式Session存在的問(wèn)題?

假設(shè)第一次訪問(wèn)服務(wù)A生成一個(gè)sessionid并且存入cookie中,第二次卻訪問(wèn)服務(wù)B客戶(hù)端會(huì)在cookie中讀取sessionid加入到請(qǐng)求頭中,如果在服務(wù)B通過(guò)sessionid沒(méi)有找到對(duì)應(yīng)的數(shù)據(jù)那么它創(chuàng)建一個(gè)新的并且將sessionid返回給客戶(hù)端,這樣并不能共享我們的Session無(wú)法達(dá)到我們想要的目的。

說(shuō)白了一句話(huà)就是: 分布式Session存在會(huì)話(huà)不一致性的問(wèn)題。 

3、分布式Session解決方案有哪些?

實(shí)現(xiàn)分布式session的方案非常多,選型時(shí)需要一種可靠、簡(jiǎn)單的實(shí)現(xiàn)方式,結(jié)合我們項(xiàng)目中的使用經(jīng)驗(yàn)來(lái)看,使用基于Redis實(shí)現(xiàn)的分布式session方案還是比較靠譜的。

看完上述內(nèi)容,你們對(duì)ASP.NET Core中怎么解決分布式Session一致性問(wèn)題有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

本文標(biāo)題:ASP.NETCore中怎么解決分布式Session一致性問(wèn)題
轉(zhuǎn)載源于:http://muchs.cn/article2/ipjgoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、軟件開(kāi)發(fā)、定制網(wǎng)站、網(wǎng)站內(nèi)鏈、標(biāo)簽優(yōu)化、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)