如果我們正在使用Session,那么構建高性能可擴展的ASP.NET網站,就必須解決分布式Session的架構,因為單服務器的 SESSION處理能力會很快出現性能瓶頸,這類問題也被稱之為Session同步。微軟有自己的分布式Session的解決方案,那就是 SessionStateServer,我們可以參考:
ASP.NET Session State Partitioning
ASP.NET load balancing and ASP.NET state server
(aspnet_state).aspx
不過本文是要換一個方案,那就是使用Memcached來到達分布式SESSION的架構。Memcached作為分布式的緩存服務器已經被廣泛應用在網站建設中。
一:Session的機制
Session是針對用戶的,我們也可以理解為是針對瀏覽器的。在瀏覽器首次訪問ASP.NET網頁的時候(網頁沒有關閉session功能),它會發送如下的HTTP頭給客戶端:
瀏覽器和服務器間就是通過這樣一種機制來確保用戶SESSION的。
如果客戶端瀏覽器禁用了Cookie會怎么樣,我們會發現每一次刷新瀏覽器Set-Cookie都是不同的,而發送請求頭中也永遠不會出現 Cookie標識。這個時候,我們會發現Session失效了(當然,微軟為了防止出現這種情況,允許我們在sessionState中設置 cookieless="true",用URL來傳遞sessionid)。
二:Memcached Providers
我使用的Memcached客戶端是Memcached Providers,下載完畢后,你會發現Memcached Providers已經提供了對分布式Session的支持功能。如果你還不會使用Memcached Providers,請參考此文Memcached Tip 1:使用Memcached Providers。Memcached Providers提供的示例是直接將SESSION存儲在數據庫,我們可以通過配置來將SESSION支持存儲在分布式SESSION的內存中,即,將下文中的dbType由SQL修改為none。:
tblSessions保存的是就是單獨的Session,如下:
四:Memcached Providers的一個BUG
在當前的Memcached Providers(1.2版本)中關于SessionStateProvider(29520-TRUNK)是有一個BUG(我已提交到 codeplex,相信他們的下一個版本應該能得到修正)的。如果我們測試SESSION失效時間,發現只要經過一次刷新后,就永遠是20分鐘(即默認)。這源于在ReleaseItemExclusive這個重載方法中(該方法用于釋放對會話數據存儲區中項的鎖定),對于Session的重新存儲沒有加上過期時間,如下:
mysql、mongodb、任何自定義的KEY-VALUE框架等等,此為后話,暫且不表。
新聞熱點
疑難解答
圖片精選